web-dev-qa-db-ja.com

エラーが発生した時間でcrontabシェルスクリプトエラーをログに記録しますか?

Crontabエラーをログに記録する一般的な方法は次のようになります。

1 */8 * * * sh /pseudo_path/test.sh 2>> my_err_log 

簡潔なコマンドですが、エラー発生時刻を記録できず、スクリプトファイルのパスが省略されています。

だから私はエラー記録関数を書きました:

PROGNAME=$(readlink -f "$0")
SCRIPT_ERR_LOG_PATH="/pseudo_path/script_err_log"

error_exit()
{
    timestamp="$(date +%Y%m%d-%H:%M:%S)"
    x_info=$(echo "Error_${PROGNAME}:Line_${1:-"null"}_")
    zeta=$x_info$timestamp
    echo "$zeta" >> $SCRIPT_ERR_LOG_PATH
    exit 1
}

この関数は、スクリプトの絶対パスとともに、エラーが発生した時刻をログに記録できます。ただし、欠点は、スクリプトを機能させるために、スクリプトのすべての行に|| error_exit $LINENOを追加する必要があることです。 Vimの一括置換を使用すると、はるかに簡単になる可能性がありますが、それでも不器用な解決策のように見えます。

それで、同じタスクを実行するためのよりスマートまたはより効率的な方法はありますか?

3
Zen

生成する予定のログ情報の量によっては、標準のloggerツールを使用して/var/logのユーザーsyslogに書き込む価値がある場合があります。

1 */8 * * * /path/to/myprog 2>&1 | logger -p user.debug -t 'myprog'

これは私のDebianベースのシステムで/var/log/debugに書かれた出力の例です:

Jul 31 00:17:09 myserver myprog: test message with user.debug

使用可能なさまざまな施設/レベルのペアがあります。 user.noticeまたはuser.infoまたはuser.debugを検討することをお勧めします。これらの一部は/var/log/messagesおよび/var/log/syslogにも書き込まれる可能性があることに注意してください。


cronジョブでstdoutstderrを区別したい場合は、stderrのみをloggerに送信します。 、このような構成を使用できます。これは、他の人が改善すると確信しています。

1 */8 * * * ( /path/to/myprog 2>&1 1>&3 | logger -p user.debug -t 'myprog' ) 3>&1
4
roaima

Bashスクリプトを作成しているように見えるので、Bashのtrapビルトインを利用してください。例えば:

#!/bin/bash
# vim: ft=sh:tw=75:fo-=t:fo+=rcq:ai:

function error_trap()
{
    local -ir __exit_code__=${1:-$?}
    local __timestamp__

    # Reset the ERR sigspec to its original disposition.
    trap - ERR

    __timestamp__=$( date --rfc-3339=seconds --date=now )

    # Hint...
    #declare -p BASH_LINENO
    #declare -p BASH_COMMAND

    echo "[${__timestamp__}] (Line: ${BASH_LINENO[0]}) :: ERROR :: ${BASH_COMMAND}" >&2

    exit ${__exit_code__}
}

# Register function 'error_trap' as the trap handler for
# the ERR (error) sigspec.
trap "{ error_trap; }" ERR

# Try it out; deliberately crash-and-burn this script.
ls this-does-not-exist

このスクリプトを呼び出したときに表示される出力は次のとおりです。

ls: cannot access this-does-not-exist: No such file or directory
[2015-07-30 01:36:32-05:00] (Line: 24) :: ERROR :: ls this-does-not-exist
5
Jim Fischer