未登录时 cronjob 不执行

未登录时 cronjob 不执行

我的 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.它是一个文本文件,只是附加新的消息,因此您可以使用moreless甚至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 ------------------------------------------------------不能帮助系统理解如何运行您的脚本。

(六年后,这将成为未来读者的答案)

相关内容