【问题标题】:errors in PHP script aren't passed back to CRONPHP 脚本中的错误不会传递回 CRON
【发布时间】:2012-06-02 18:36:00
【问题描述】:

我有一些 PHP 脚本为我做一些工作并打印一些日志信息。这是调用的结构:

Crontab

*/3 *  *   *   *     sleep 180 && cd /var/www/tasks && ./wrapper.sh start "/usr/bin/php stat-import.php" stat-import >> stat-import.log

包装器.sh

#!/bin/bash

function start
{
    WRAP_CMD="$1"
    WRAP_DESC="$2"
    ARGS=($WRAP_CMD)
    if [[ ( $WRAP_DESC ) && ( -n $WRAP_DESC ) ]]
    then
        OUT_DESC="$WRAP_DESC"
    else
        OUT_DESC="$WRAP_CMD"
    fi
    PID=`ps axw -o pid,command | grep "$WRAP_CMD" | grep -v grep | grep -v "$0" | awk '{print $1}' | awk '{print $1}'`
    if [[ ( $PID ) && ( -n $PID ) ]]
    then
        echo `date +'%Y-%m-%d %H:%M:%S'`" INFO - $OUT_DESC already running"
    else
        echo `date +'%Y-%m-%d %H:%M:%S'`" INFO - $OUT_DESC started"
        $WRAP_CMD
        ECODE=$?
        echo `date +'%Y-%m-%d %H:%M:%S'`" INFO - $OUT_DESC finished"
        exit $ECODE
    fi
}

function stop
{
    [...]
}

function main
{
    if [[ ( $# < 2 ) || ( $# > 3 ) ]]
    then
        echo "Usage: $0 [start|stop] COMMAND [DESCRIPTION]"
        exit 0
    fi
    if [ $1 == "start" ]
    then
        start "$2" "$3"
    elif [ $1 == "stop" ]
    then
        stop "$2" "$3"
    else
        echo "Usage: $0 [start|stop] COMMAND [DESCRIPTION]"
    fi
    exit 0
}

# Script execution:
main "$@"

stat-import.php

<?php
    die("error message");
    // OR
    exit(127);
    // OR
    trigger_error("error_message", E_USER_ERROR);

默认情况下,只有 wrapper.sh 或我的 PHP 脚本中的语法错误会导致 CRON 发送邮件。我在stat-import.php 中定义的错误没有传递给 CRON 而是进入日志文件?嗯?

【问题讨论】:

    标签: php bash error-handling cron


    【解决方案1】:

    默认情况下,PHP 错误会打印到 stdout,您的 cron 会将其重定向到日志文件。您需要将错误打印到 stderr,以便它们将由 cron 守护进程邮寄:display_errors setting in PHP docs

    【讨论】:

    • 好的,这似乎只影响trigger_error()。我也测试过error_log(),无论display_errorserror_reporting 设置如何,它似乎都以STDERR 输出
    • error_log($msg, 0) 向配置设置error_log 定义的目标发送错误,使用CLI 时默认为STDERR
    【解决方案2】:

    您的 crontab 条目需要将 stderr 重定向到您的日志文件中(注意行尾的 2&amp;&gt;1)。即

    */3 *  *   *   *     sleep 180 && cd /var/www/tasks && ./wrapper.sh start "/usr/bin/php stat-import.php" stat-import >> stat-import.log 2>&1
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2016-12-06
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多