最近遇到一个坑,在生产环境用自动化脚本执行注释和解注释时有部分定时任务没解开。
[root@node01 ~]# crontab -l
*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
[root@node01 ~]# sed -i '/$HOME\/sbin\/sms_alarm.sh/s/^/#/' /var/spool/cron/root
[root@node01 ~]# crontab -l
#*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
注释脚本没问题,执行后会在行首新增#
[root@node01 ~]# crontab -l
#*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
[root@node01 ~]# sed -i '/^#.*$HOME\/sbin\/sms_alarm.sh/s/^#//g' /var/spool/cron/root
[root@node01 ~]# crontab -l
*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
执行注释脚本,发现定时任务被解注释,看似没问题,其实在生产环境中如果都用自动化方式,一般不会有问题,因为注释和解注释都是分发脚本至各台服务器自动执行,但是不能排除偶尔应急或手动操作,这时定时任务就可能会注释两次或多次,模拟如下:
[root@node01 ~]# crontab -l
##*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
[root@node01 ~]# sed -i '/^#.*$HOME\/sbin\/sms_alarm.sh/s/^#//g' /var/spool/cron/root
[root@node01 ~]# crontab -l
#*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
本次就遇到了这种问题,由于各种原因导致定时任务注释时前面不止一个#,解注释脚本只能去除一个,导致定时任务没能放开。
[root@node01 ~]# crontab -l
###*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
[root@node01 ~]# sed -i '/^#.*$HOME\/sbin\/sms_alarm.sh/s/^#*//g' /var/spool/cron/root
[root@node01 ~]# crontab -l
*/10 * * * * $HOME/sbin/sms_alarm.sh 1>/dev/null 2>&1
只需要在sed脚本替换#时新增一个*即可,代表匹配一个或多个#
问题解决,完美!