V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
phpfpm
V2EX  ›  Linux

我今天看了一下 crontab 的任务,居然回滚了生产环境 crontab 的配置……

  •  
  •   phpfpm · 2019-02-22 13:14:58 +08:00 · 3638 次点击
    这是一个创建于 2101 天前的主题,其中的信息可能已经有所发展或是发生改变。

    早晨到公司上班,同事说某台 crontab 的服务器负载有点高,于是我就登上去 敲了一行

    phpfpm@cron:~$ sudo su www crontab -l
    

    因为 php-fpm 和 php 脚本都是用 www 启动的,所以 crontab 的 job 也在 www 用户里面。

    之后,弹出来一串 bash 报错之后,我就神奇的发现 crontab 的配置被回滚到一个一年前的备份了。 有人能猜到发生什么吗?

    先不多说了,我赶飞机跑路了。。。

    第 1 条附言  ·  2019-02-22 16:06:16 +08:00

    补充简要说一下发生了什么。

    1 sudo -u www crontab -l 敲成了

    sudo su www crontab -l
    

    等价于

    sudo su -l www [args=crontab]
    

    等价于

    sudo su -l www
    /bin/bash crontab
    

    2 su和crontab碰巧都有-l这个参数 su -l 是说切换到login shell并改变pwd

    3 ~www/下有crontab这个文件 当然,还有一个文件叫做crontab.xxx 除此以外没有别的文件了

    www:~$ ls
    crontab crontab.foo
    

    4 crontab是备份的最新版本的配置,而crontab.foo是去年的某个版本的配置

    crontab配置里面,bash执行的时候 对于#开头的注释,不执行不报错 对于数字开头的 0 50等等 报 not found 对*/20这样的 也找不到 这些传到bash都不会被解析

    但是唯独有两行

            • /foo bar 被解析执行了

    5 * 被展开为 crontab crontab.foo 多个*展开为多份

    于是相当于crontab source了crontab.foo

    我……学到了。。。

    16 条回复    2019-02-25 17:52:35 +08:00
    defunct9
        1
    defunct9  
       2019-02-22 14:02:32 +08:00   ❤️ 1
    猜不到,估计得打宇宙飞车跑路
    secboy
        2
    secboy  
       2019-02-22 14:06:26 +08:00
    说出你的故事
    MeteorCat
        3
    MeteorCat  
       2019-02-22 14:10:56 +08:00 via Android
    我上次也是倒霉,sudo crontab -按下去的时候,打个喷嚏条件反射按了 r 和回车
    9hills
        4
    9hills  
       2019-02-22 14:12:48 +08:00 via iPhone
    没这么简单吧,你可以 history 看你具体执行的命令

    crontab 后面加文件名可以加载文件内容到 crontab 中,百分之九十九的可能性是误操作了
    mgso
        5
    mgso  
       2019-02-22 14:27:58 +08:00 via iPhone
    顺便说下 键盘上 e 键和 r 键靠得太近了🤔🤔🤔
    wingoo
        6
    wingoo  
       2019-02-22 14:39:01 +08:00
    e,r 也按错过一次, 一身冷汗, 还好有备份
    joysir
        7
    joysir  
       2019-02-22 14:44:10 +08:00
    你的命令写法错误,导致被解析为 crontab -l 被解析为 su 的参数了,具体如下:

    1. sudo su www 切换到 www 用户,并进入该用户的家目录
    2. crontab 打开当前目录的 crontab 文件并执行(然而,你 www 家目录正好有一个名为 crontab 的备份文件)
    3. -l 模拟重新登录
    joysir
        8
    joysir  
       2019-02-22 14:45:22 +08:00
    @joysir 输入太快,第一句表达有误,应该是:
    你的命令写法错误,导致 crontab -l 被解析为 su 的参数了,具体如下:
    yulgang
        9
    yulgang  
       2019-02-22 15:05:06 +08:00
    难道你执行了 source ~/.bash_history ? 😂
    phpfpm
        10
    phpfpm  
    OP
       2019-02-22 15:59:32 +08:00
    @joysir 对头,我一会说详细的。
    firebroo
        11
    firebroo  
       2019-02-22 16:07:51 +08:00
    顺便说下 键盘上 e 键和 r 键靠得太近了🤔🤔🤔
    geeti
        12
    geeti  
       2019-02-22 16:20:26 +08:00
    你们登陆 production 不需要第二个人在旁边看着么
    phpfpm
        13
    phpfpm  
    OP
       2019-02-22 16:27:45 +08:00
    @geeti emm 如果不执行危险操作一般都是自己来吧
    and,如果有一些修改的什么的走 saltstack

    对于 crontab,我们有一套管理平台平时增删改都在那上面
    排查问题的时候我就顺手在服务器上看了。。
    Ansen
        14
    Ansen  
       2019-02-22 16:39:17 +08:00   ❤️ 1
    所以我一般都是 cat /var/spool/cron/xxxx
    BubbleNoodle
        15
    BubbleNoodle  
       2019-02-22 17:03:58 +08:00
    不建议在环境变量下面,引用 crontab

    踏踏实实放在 etc 下面。
    phpfpm
        16
    phpfpm  
    OP
       2019-02-25 17:52:35 +08:00
    @Ansen 好主意~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2526 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:38 · PVG 23:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.