【问题标题】:Debugging crontab jobs调试 crontab 作业
【发布时间】:2011-06-20 11:07:40
【问题描述】:

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

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

所以有两种可能的原因:

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

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

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

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

【问题讨论】:

    标签: linux cron


    【解决方案1】:

    将 2>&1 添加到 Crontab 命令的末尾。这会将标准错误输出重定向到标准输出。然后确保您正在记录 crontab 的 Unix 命令。

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

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

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

    set
    set -x
    

    【讨论】:

    • 它仍然没有记录任何东西。 crontab 命令是25 08 * * * /root/java/MyProject/sync.sh >> /root/java/Migration/sync.log 2>&1。但是,如果我执行 shell 脚本,那么代码会运行并且 java logger 类会写入日志文件
    • 您是否在脚本中设置环境变量?通常,如果脚本从命令行运行而不是从 cron 运行,则它可以是环境。让 synch.sh 将其 env 输出写入日志。
    • 我需要设置哪些变量?我从终端尝试了env 命令,它没有显示 JAVA_HOME 或 CLASSPATH。这是我刚刚安装 JRE 而不是 JDK 的实时服务器。谢谢
    • 好的.. 从我这边看,这是一个非常愚蠢的错误。完全错过了 vi 编辑器在 crontab 中注释掉的行! ..抱歉打扰了。
    【解决方案2】:

    您可以为 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
    

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

    【讨论】:

    • 在我这样做之后,我可以找到这个日志。 (CRON) info (No MTA installed, discarding output)。所以我安装了后缀,然后我可以看到less /var/mail/<user> 的一些日志
    【解决方案3】:

    对于其他为此苦苦挣扎的人。 Cronjobs 将自己登录到 /var/mail/{username} 中,即使他们不执行标准输出

    【讨论】:

    • 您需要安装邮件服务才能使用。对于 ubuntu:sudo apt-get install postfix
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      可能导致您的问题的一件事是cron(至少在我使用的发行版中,Amazon Linux OS)认为时间是 UTC,因此如果您在不同的时区(例如 -03: 00) 你可能希望它提前 3 小时运行,实际上它会运行,实际上你没有任何问题。

      【讨论】:

        【解决方案6】:

        检查你是否真的格式化了它必须运行良好的时间。

        例如代替

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

        可能是这样的:

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

        您可能希望它每分钟运行一次。而且也不会生成任何日志。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 2020-01-19
          • 1970-01-01
          • 1970-01-01
          • 2021-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多