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のバッチ交換を使用する方がはるかに簡単かもしれませんが、それでもまだ薄暗い解決策のようです。
それでは、同じことを行うよりスマートで効率的な方法はありますか?
答え1
trap
私の考えでは、Bashスクリプトを書いているようですので、Bashに組み込まれているスクリプトを活用してください。たとえば、
#!/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
答え2
logger
生成する予定のログ情報の量に応じて、標準ツールを使用してユーザーのシステムログに記録することをお勧めします/var/log
。
1 */8 * * * /path/to/myprog 2>&1 | logger -p user.debug -t 'myprog'
/var/log/debug
これは私のDebianベースのシステムに書かれた出力の例です。
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
ただ送ってください標準エラーの場合、logger
次の構成を使用でき、他の人もこれを改善すると確信しています。
1 */8 * * * ( /path/to/myprog 2>&1 1>&3 | logger -p user.debug -t 'myprog' ) 3>&1