
早晨到公司上班,同事说某台 crontab 的服务器负载有点高,于是我就登上去 敲了一行
phpfpm@cron:~$ sudo su www crontab -l 因为 php-fpm 和 php 脚本都是用 www 启动的,所以 crontab 的 job 也在 www 用户里面。
之后,弹出来一串 bash 报错之后,我就神奇的发现 crontab 的配置被回滚到一个一年前的备份了。 有人能猜到发生什么吗?
先不多说了,我赶飞机跑路了。。。
补充简要说一下发生了什么。
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都不会被解析
但是唯独有两行
5 * 被展开为 crontab crontab.foo 多个*展开为多份
于是相当于crontab source了crontab.foo
我……学到了。。。
1 defunct9 2019 年 2 月 22 日 猜不到,估计得打宇宙飞车跑路 |
2 secboy 2019 年 2 月 22 日 说出你的故事 |
3 MeteorCat 2019 年 2 月 22 日 via Android 我上次也是倒霉,sudo crontab -按下去的时候,打个喷嚏条件反射按了 r 和回车 |
4 9hills 2019 年 2 月 22 日 via iPhone 没这么简单吧,你可以 history 看你具体执行的命令 crontab 后面加文件名可以加载文件内容到 crontab 中,百分之九十九的可能性是误操作了 |
5 mgso 2019 年 2 月 22 日 via iPhone 顺便说下 键盘上 e 键和 r 键靠得太近了 |
6 wingoo 2019 年 2 月 22 日 e,r 也按错过一次, 一身冷汗, 还好有备份 |
7 joysir 2019 年 2 月 22 日 你的命令写法错误,导致被解析为 crontab -l 被解析为 su 的参数了,具体如下: 1. sudo su www 切换到 www 用户,并进入该用户的家目录 2. crontab 打开当前目录的 crontab 文件并执行(然而,你 www 家目录正好有一个名为 crontab 的备份文件) 3. -l 模拟重新登录 |
9 yulgang 2019 年 2 月 22 日 难道你执行了 source ~/.bash_history ? |
11 firebroo 2019 年 2 月 22 日 顺便说下 键盘上 e 键和 r 键靠得太近了 |
12 geeti 2019 年 2 月 22 日 你们登陆 production 不需要第二个人在旁边看着么 |
13 phpfpm OP @geet emm 如果不执行危险操作一般都是自己来吧 and,如果有一些修改的什么的走 saltstack 对于 crontab,我们有一套管理平台平时增删改都在那上面 排查问题的时候我就顺手在服务器上看了。。 |
14 Ansen 2019 年 2 月 22 日 所以我一般都是 cat /var/spool/cron/xxxx |
15 BubbleNoodle 2019 年 2 月 22 日 不建议在环境变量下面,引用 crontab 踏踏实实放在 etc 下面。 |