我的 crontab 中有一个 cronjob。
当我指定要在2分钟内执行的作业时,我等待,然后我可以看到作业创建的文件,我可以用ps看到进程。作业至少需要 10 分钟才能完成。
但是,如果我指定要在 2 分钟内执行的作业,然后我退出,几分钟后我又回来了,似乎该作业尚未执行(未创建文件,并且进程不在 ps 中)。
当我查看 /var/log/syslog 时,我可以看到作业“已开始”,但立即(同一秒)cron 尝试发送邮件。可能是带有结果的邮件。(好吧,sendmail 配置不正确,但这不应该是根本原因)。
你有什么主意吗 ?
下面是一些具体的例子:(python是我机器的名字)
我使用 crontab -e 编辑 crontab。
这是 crontab :
user@python:~$ crontab -l
[...]
# m h dom mon dow command
50 9 * * * /home/user/scripts_automated/crontab1.sh
Run Code Online (Sandbox Code Playgroud)
它应该在 9:50 运行
这是 /var/log/syslog 的内容:
[...]
Nov 6 09:48:02 python crontab[30913]: (user) BEGIN EDIT (user)
Nov 6 09:48:18 python crontab[30913]: (user) REPLACE (user)
Nov 6 09:48:18 python crontab[30913]: (user) END EDIT (user)
Nov 6 09:50:01 python CRON[30936]: (user) CMD (/home/user/scripts_automated/crontab1.sh)
Nov 6 09:50:01 python sendmail[30938]: sA68o1a4030938: from=user, size=347, class=0, nrcpts=1, msgid=<201411060850.sA68o1a4030938@python>, relay=user@localhost
[...]
Run Code Online (Sandbox Code Playgroud)
正如你在日志中看到的,我crontab在 09:48:02编辑了,然后我注销了。我回到机器上(使用ssh),该作业没有生成它应该生成的任何文件。
这是脚本的内容:
user@python:~$ cat scripts_automated/crontab1.sh
# 0 ------------------------------------------------------
datenow=`date +%F_%H-%M-%S`
/home/user/scripts_automated/script_1_cisco_grab.sh > /home/user/scripts_automated/crontab/run_${datenow}_.txt 2>&1 &
echo $! > /home/user/scripts_automated/crontab/pid_${datenow}.txt
ln -s /home/user/scripts_automated/crontab/pid_${datenow}.txt /home/user/scripts_automated/crontab/pid_last_run.txt
Run Code Online (Sandbox Code Playgroud)
并且没有生成文件。我至少希望该文件pid_${datenow}.txt与后台命令的 pid 一起存在。但没什么。如果我不注销,则脚本会执行、生成输出文件、pid_${datenow}文件等...
您应该将脚本放在一个单独的目录中,该目录在 cron 作业运行时肯定可用,例如/usr/local/bin/.
写这样的crontab条目也是一个很好的习惯:
M H * * * test -x /usr/local/bin/myscript.sh && /usr/local/bin/myscript.sh
Run Code Online (Sandbox Code Playgroud)
因此,如果脚本不可用,crontab 甚至不会尝试执行该脚本。
您怀疑注销是问题所在,您还应该尝试注销然后及时返回以便 crontab 运行然后观察。这样,如果注销是问题或未登录,您就可以缩小范围。