调试crontab任务

86

我在一台Linux服务器上添加了一个crontab条目,用于运行一个Java可执行文件。Java代码使用自己的类将错误和消息记录到日志文件中。

但是在计划时间后检查日志文件时,没有记录任何消息。应该至少有一条日志消息说明已经开始执行。

所以有两种可能的原因:

  1. 代码已执行但未记录;
  2. 或者代码根本没有执行。

指定的日志文件具有chmod 777权限,所以我猜测这是第二个原因。

为什么crontab作业不会按计划时间执行?如何调试此问题而没有任何日志记录?

我已经阅读了如果出现错误,cron会向用户发送电子邮件的信息。如何找出与用户关联的电子邮件地址?

6个回答

147

为了追踪问题,您可以启用cron作业的日志记录。您需要编辑/etc/rsyslog.conf/etc/rsyslog.d/50-default.conf(在Ubuntu上),并确保取消注释以下行或添加它(如果缺少):

您可以启用cron作业的日志记录。您需要编辑/etc/rsyslog.conf/etc/rsyslog.d/50-default.conf(在Ubuntu上),并确保取消注释以下行或添加它(如果缺少):

cron.*                         /var/log/cron.log

然后重新启动 rsyslogcron

sudo service rsyslog restart
sudo service cron restart

计划任务将记录在 /var/log/cron.log 中。


3
之后,我发现了这个日志:(CRON) info (No MTA installed, discarding output)。于是我安装了Postfix,然后就可以通过less /var/mail/看到一些日志了。<user>`</user> - Kennyhyun

50

在你的Crontab命令末尾添加2>&1,这将把stderr输出重定向到stdout。然后确保记录Crontab的Unix命令。

0 0,12 1 */2 * ( /sbin/ping -c 1 192.168.0.1; ls -la ) >>/var/log/cronrun 2>&1

这将捕获Unix命令中的任何内容。

在帮助同事之后,我还有一些额外的提示。通过无参数的set命令写出环境变量。并使用set -x命令让shell回显每个命令。在脚本顶部发出以下命令;

set
set -x

它仍然不记录任何内容。 crontab命令为25 08 * * * /root/java/MyProject/sync.sh >> /root/java/Migration/sync.log 2>&1。但是,如果我执行shell脚本,则代码会运行,并且Java日志记录器类将写入日志文件。 - naiquevin
你在脚本中设置环境变量了吗?如果脚本可以从命令行运行但无法从cron运行,通常是因为环境问题。让synch.sh将其环境输出写入日志。 - Karl
我需要设置哪些变量?我尝试了终端中的 env 命令,但它没有显示出 JAVA_HOME 或 CLASSPATH。这是一个实时服务器,我只安装了 JRE 而不是 JDK。谢谢。 - naiquevin
好的,这是我犯的一个非常愚蠢的错误。我完全忽略了vi编辑器在crontab中注释掉的行!对打扰感到抱歉。 - naiquevin

17

如果其他人也遇到这个问题,请注意,即使它们没有标准输出,cronjob仍会将日志记录在/var/mail/{username}中。


2
你需要安装邮件服务才能使其正常工作。对于Ubuntu系统:sudo apt-get install postfix - aksh1618
1
这真的帮了很大的忙。原来我尝试写入的日志文件没有权限。我只是从一封记录在这个位置的邮件中发现了这一点:“无法创建/var/log/cron.log:权限被拒绝”。 - undefined

7
假设手动运行命令可以正常工作,但在Cron中无法正常工作,则可能是正确路径没有被 Cron 命令暴露出来。您可以通过运行 crontab -e,然后直接输入路径到 cron 选项卡中来解决此问题:
``` # 将路径导出以使脚本能够正常运行 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin ```

3

可能导致您问题的一个原因是 cron (至少在我使用的发行版 Amazon Linux OS 中)将时间视为 UTC 时间,因此如果您位于不同的时区(例如 -03:00),则可能期望它比实际运行提前 3 小时,实际上您并没有任何问题。


2
检查一下在时间必须运行良好时是否真正格式化了它。
例如,不要写成

*/1 * * * * echo 'debug' > /home/glab/change_branch.log

可能是这样的:
1 * * * * echo 'debug' > /home/glab/change_branch.log

你可能希望它每分钟运行一次。但是没有生成任何日志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接