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

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

  •  
  •   phpfpm · 123 天前 · 2000 次点击
    这是一个创建于 123 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    [email protected]:~$ sudo su www crontab -l
    

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

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

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

    第 1 条附言  ·  123 天前

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

    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
        1
    defunct9   123 天前   ♥ 1
    猜不到,估计得打宇宙飞车跑路
        2
    secboy   123 天前
    说出你的故事
        3
    MeteorCat   123 天前 via Android
    我上次也是倒霉,sudo crontab -按下去的时候,打个喷嚏条件反射按了 r 和回车
        4
    9hills   123 天前 via iPhone
    没这么简单吧,你可以 history 看你具体执行的命令

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

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

    对于 crontab,我们有一套管理平台平时增删改都在那上面
    排查问题的时候我就顺手在服务器上看了。。
        14
    Ansen   123 天前   ♥ 1
    所以我一般都是 cat /var/spool/cron/xxxx
        15
    BubbleNoodle   123 天前
    不建议在环境变量下面,引用 crontab

    踏踏实实放在 etc 下面。
        16
    phpfpm   120 天前
    @Ansen 好主意~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1056 人在线   最高记录 5043   ·   Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 21ms · UTC 18:30 · PVG 02:30 · LAX 11:30 · JFK 14:30
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1