调试crontab作业

nai*_*vin 52 linux cron

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

但是当我在预定时间之后检查了日志文件时,没有记录任何消息.应该至少有一条日志消息说执行已经开始.

所以有两个可能的原因:

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

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

为什么crontab作业不会在预定时间执行?如何在没有任何日志记录的情况下调试它?

我已经读过,如果有错误,cron会向用户发送一封电子邮件.如何找出与用户关联的电子邮件地址?

Meh*_*des 74

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

cron.*                         /var/log/cron.log
Run Code Online (Sandbox Code Playgroud)

然后重启rsyslogcron:

sudo service rsyslog restart
sudo service cron restart
Run Code Online (Sandbox Code Playgroud)

Cron的工作将登录到/var/log/cron.log.

  • 完成此操作后,我可以找到此日志。`(CRON) 信息(未安装 MTA,丢弃输出)`。所以我安装了 postfix 然后我可以通过 `less /var/mail/<user>` 看到一些日志 (4认同)

Kar*_*arl 37

将2>&1附加到Crontab命令的末尾.这会将stderr输出重定向到stdout.然后确保您正在记录crontab的Unix命令.

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

这将从Unix命令中捕获任何内容.

几个额外的提示(前几天帮助同事之后......).通过发出不带参数的命令集来写出环境变量.并使用set -x命令获取shell以回显每个命令.在脚本问题的顶部;

set
set -x
Run Code Online (Sandbox Code Playgroud)


小智 6

假设手动运行命令有效,但在 Cron 中无效,可能是正确的路径没有暴露给 cron 命令。您可以通过运行 crontab -e 然后直接在 cron 选项卡中输入路径来解决此问题:

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin


Mic*_*iot 6

对于其他为此而苦苦挣扎的人。即使不执行 stdoutput,Cronjobs 也会将自己登录到 /var/mail/{username}

  • 您需要安装邮件服务才能正常工作。对于 ubuntu:`sudo apt-get install postfix` (2认同)