2

いくつかのPHPスクリプトが私のためにいくつかの作業を行い、いくつかのログ情報を出力しています。これは、呼び出しの構造です。

Crontab

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

wrapper.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スクリプト内またはPHPスクリプト内の構文エラーのみがCRONによるメールになります。ユーザー定義のエラーはstat-import.phpCRONに渡されませんが、ログファイルに記録されますか?は?

4

2 に答える 2

1

デフォルトでは、PHPエラーはに出力されstdoutます。これはcronがログファイルにリダイレクトします。代わりにエラーを出力する必要があるため、エラーstderrはcronデーモンによってメールで送信されます:PHPドキュメントのdisplay_errors設定

于 2012-05-28T11:32:19.323 に答える
0

crontabエントリは、stderrをログファイルにリダイレクトする必要があります(2&>1行末のに注意してください)。すなわち

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

これがお役に立てば幸いです。

于 2012-05-28T18:30:02.560 に答える