2011-02-03 76 views
23

我已经在运行Java可执行文件的Linux服务器上添加了crontab项。 Java代码使用它自己的类将错误和消息记录到日志文件中。调试crontab作业

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

因此,有两个可能的原因:

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

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

为什么crontab作业不能在预定的时间执行?我如何在没有发生任何记录的情况下进行调试?

我读过,如果有错误cron发送电子邮件给用户。如何找出哪个电子邮件地址与用户关联?

回答

23

将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 

这将捕获任何来自Unix命令。

一些额外的提示(前一天帮助一个同事......)。通过发出没有参数的命令集来写出环境变量。然后让shell使用set -x命令来回显每个命令。在脚本问题的顶部;

set 
set -x 
+0

仍犯规记录任何东西。 crontab命令是`25 08 * * * /root/java/MyProject/sync.sh >> /root/java/Migration/sync.log 2>&1`。但是,如果我执行shell脚本,那么代码将运行,并且java记录器类将写入日志文件 – naiquevin 2011-02-03 08:24:28

0

检查您是否确实格式化了运行良好的时间。

例如,而不是

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

可能是这样的:

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

,你可能期待它为每分钟运行。并且也没有生成日志。

0

可能导致你的问题的一件事是,cron(至少在我使用的分布,亚马逊Linux操作系统)认为时间是UTC,因此如果你在不同的时区(例如-03:00 )你可能会预计它会提前3个小时运行,它实际上会和你没有任何问题。

23

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

cron.*       /var/log/cron.log 

然后重新启动rsyslogcron

sudo service rsyslog restart 
sudo service cron restart 

Cron作业将登录到/var/log/cron.log

0

假设手动运行该命令,但不在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