我设置了几个 cron 作业。我最近添加了一个新的 cron 作业,它从另一台服务器复制前一天的文件并每天执行(例如在上午 06:00),但当我第二天检查时,文件尚未复制。
当我到达办公室并意识到该作业未执行时,我使用 crontab -e(使用相同的 root 用户)编辑该作业,并将该作业设置为在接下来的 30 分钟内执行。这次 cron 作业成功执行。
为什么这项工作没有在凌晨 04:00 或 06:00 执行,但在白天却可以执行?
如何检查作业未执行的原因?
我在 GNU/Linux CentOS (2.6.32) 系统上工作。感谢您的帮助。
更新
我需要复制的文件是在23:00之前在原始服务器上创建的。
我有这样的 cron 作业:(第一行是失败的作业。复制文件的相关脚本是script1.sh
)
[root@srvc ~]# crontab -l
0 6 * * * /path/to/scripts/script1.sh
0 5 * * * /path/to/scripts/script3.sh
0 8 * * 1 /path/to/scripts/script4.sh
当我今天上午 11:00 左右检查文件未被复制时,我编辑了 cron 作业以在上午 11:10 执行,并且文件被成功复制。
[root@srvc ~]# crontab -l
10 11 * * * /path/to/scripts/script1.sh
内容script1.sh
是这样的:
#!/bin/bash
dyear=`date +'%Y' -d "1 day ago"`
dmonth=`date +'%b' -d "1 day ago"`
ddate=`date +%Y-%m-%d -d "1 day ago"`
sshpass -p 'ThePassword' scp -r [email protected]:/path/to/files/*$ddate* /Destination/path/$dyear/$dmonth/
要复制的文件的名称格式为Logfile.2019-02-20
答案1
有很多原因。
无法判断为什么该作业没有运行,也许它运行时没有复制文件。因为文件还没有到位。因为服务器宕机了。因为网络有问题。因为另一台机器上的 ssh 暂时停止了。选几个吧。
如果你想知道发生了什么,记录事件。在 cronjob 的开始处输入
logger "Starting my cronjob"
而scp someone@server:file /somewhere
不是
ssh someone@server ls -l file | logger
scp someone@server:file /somewhere
ls -l /somewhere/file | logger
最后在 cronjob 结束时:
logger "This cronjob has ended"
我在这里说的可能有点夸张,但重点是,如果你不提供信息,你永远不会知道发生了什么。我们可能正在调试你的 crontab 规则,而问题实际上出在你的 scp 上。
哦,是的,cron 可能也在你的系统日志中放了一些内容。