我的 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
应该在 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
[...]
正如您在日志中看到的,我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
并且不会生成任何文件。我至少希望该文件pid_${datenow}.txt
与后台命令的 pid 一起存在。但什么也没有。如果我不注销,那么脚本就会执行,生成输出文件、pid_${datenow}
文件等等......
答案1
您应该将脚本放在一个单独的目录中,该目录在 cron 作业运行时肯定可用,例如/usr/local/bin/
.
crontab
像这样编写条目也是一个好习惯:
M H * * * test -x /usr/local/bin/myscript.sh && /usr/local/bin/myscript.sh
因此,如果脚本不可用,则 crontab 甚至不会尝试执行该脚本。
您怀疑注销是问题所在,您还应该尝试注销然后及时返回,以便 crontab 运行并观察。这样,如果注销是问题或未登录,您就可以缩小范围。
答案2
日志文件显示 crontab 作业已被触发:
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
日志文件中的下一行几乎肯定是这一行的补充行,显示它的去向。
为什么电子邮件具有相关性? CRON 捕获标准输出和标准错误从它解雇的每一份工作中。如果其中一个非空,则它会向用户的本地电子邮件帐户发送一封电子邮件,其中包含其捕获的文本。在user
这种情况下,这将发送至 的user
本地电子邮件帐户。 (如果您配置了电子邮件子系统,那么它可能会被转发到场外,但我们假设现在不会。)本地电子邮件通常会写入文件/var/mail/$USER
或/var/spool/mail/$USER
.它是一个文本文件,只是附加新的消息,因此您可以使用more
或less
甚至cat
查看该文件。最后一条消息可能是您想阅读的消息。
看看您创建的脚本,我怀疑在您的情况下生成的错误消息会是这样的,
-sh: /home/user/scripts_automated/crontab1.sh: Permission denied
如果是这种情况,那是因为您尝试crontab1.sh
作为程序运行,但忽略了使其可执行。用 修复这个问题chmod a+x /home/user/scripts_automated/crontab1.sh
。
其他错误可能与缺少环境变量有关,包括PATH
未按预期设置。这是因为cron
环境非常受限制,并且不使用.bashrc
、.profile
等启动文件。另一种可能是您的主目录在您未登录时可能被加密。在这种情况下,cron
将无法找到要执行的脚本,因此只能失败。有很多问题(和答案)https://unix.stackexchange.com/解决此类问题,因此我不会在这里重复它们。
我对脚本的另一个问题通常是它应该从#!
它的解释器的路径开始。如果是这样,bash
您通常会写#!/bin/bash
,如果是,sh
您会使用#!/bin/sh
.从开始并# 0 ------------------------------------------------------
不能帮助系统理解如何运行您的脚本。
(六年后,这将成为未来读者的答案)