一个crontab不运行问题的坑

2020-04-25  本文已影响0人  qboy0000

由于需要在脚本中添加crontab,因此需要通过脚本来向crontab中添加命令,大致脚本如下。

TMP_CRON=/tmp/tmp_cron
rm -rf $TMP_CRON
#crontab -u root -l
echo `crontab -u root -l` >> $TMP_CRON
if [ `grep -c "rsync.sh" $TMP_CRON` -eq 0 ]; then
    cronjob="*/1 * * * * rsync.sh >> /var/log/rsync.log"
    echo "$cronjob" >> $TMP_CRON
    crontab -u root $TMP_CRON
fi

执行完上面的语句之后执行crontab -l发现已将任务添加上了,于是就放心没管,过了一段时间却发现没有执行成功,很奇怪,但是同样的,使用crontab -e手动添加的一样的语句却执行成功了。于是让我非常苦恼,不知道什么问题。

查看cron日志

本来想直接查看/var/log目录下是否有cron的日志,发现并没有cron日志,根据[2],原来cron的日志需要通过syslog来管理,于是参照[2]进行设定

# 修改rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
cron.*              /var/log/cron.log #将cron前面的注释符去掉 
# 重启rsyslog
sudo  service rsyslog  restart
# 查看crontab日志
less  /var/log/cron.log 

设定权限并重启cron

查看cron.log发现以下一句话

(root) INSECURE MODE (mode 0600 expected) (crontabs/root)

原来这是导致运行失败的原因,与[3]相似。根据其说明/var/spool/cron/crontabs/root的文件权限应该为600,而使用上面的权限生成的文件权限是644,因此权限失败。
因此在上面脚本中添加以下的语句

chmod 600 /var/spool/cron/crontabs/root
systemctl restart cron

至此,任务即可正常的运行,问题解决。

参考链接

  1. https://www.virtualmin.com/node/54973
  2. https://blog.csdn.net/woshiliulei0/article/details/54136885
  3. https://blog.csdn.net/u012129468/article/details/77926701
上一篇下一篇

猜你喜欢

热点阅读