由于需要在脚本中添加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
至此,任务即可正常的运行,问题解决。
网友评论