早晨到公司上班,同事说某台 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-02-22 14:02:32 +08:00 1
猜不到,估计得打宇宙飞车跑路
|
2
secboy 2019-02-22 14:06:26 +08:00
说出你的故事
|
3
MeteorCat 2019-02-22 14:10:56 +08:00 via Android
我上次也是倒霉,sudo crontab -按下去的时候,打个喷嚏条件反射按了 r 和回车
|
4
9hills 2019-02-22 14:12:48 +08:00 via iPhone
没这么简单吧,你可以 history 看你具体执行的命令
crontab 后面加文件名可以加载文件内容到 crontab 中,百分之九十九的可能性是误操作了 |
5
mgso 2019-02-22 14:27:58 +08:00 via iPhone
顺便说下 键盘上 e 键和 r 键靠得太近了🤔🤔🤔
|
6
wingoo 2019-02-22 14:39:01 +08:00
e,r 也按错过一次, 一身冷汗, 还好有备份
|
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 模拟重新登录 |
8
joysir 2019-02-22 14:45:22 +08:00
@joysir 输入太快,第一句表达有误,应该是:
你的命令写法错误,导致 crontab -l 被解析为 su 的参数了,具体如下: |
9
yulgang 2019-02-22 15:05:06 +08:00
难道你执行了 source ~/.bash_history ? 😂
|
11
firebroo 2019-02-22 16:07:51 +08:00
顺便说下 键盘上 e 键和 r 键靠得太近了🤔🤔🤔
|
12
geeti 2019-02-22 16:20:26 +08:00
你们登陆 production 不需要第二个人在旁边看着么
|
13
phpfpm OP @geeti emm 如果不执行危险操作一般都是自己来吧
and,如果有一些修改的什么的走 saltstack 对于 crontab,我们有一套管理平台平时增删改都在那上面 排查问题的时候我就顺手在服务器上看了。。 |
14
Ansen 2019-02-22 16:39:17 +08:00 1
所以我一般都是 cat /var/spool/cron/xxxx
|
15
BubbleNoodle 2019-02-22 17:03:58 +08:00
不建议在环境变量下面,引用 crontab
踏踏实实放在 etc 下面。 |