Bash
使用發生錯誤的時間記錄 crontab shell 腳本錯誤?
記錄 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 的批量替換它可能會容易得多,但它看起來仍然是一個笨拙的解決方案。那麼,有沒有更聰明或更有效的方法來完成同樣的任務呢?
根據您期望生成的日誌資訊的數量,可能值得使用標準
logger
工具將其寫入使用者 syslog in/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
oruser.info
或user.debug
。請注意,其中一些也可能被寫入/var/log/messages
和/var/log/syslog
。如果您想在工作中區分stdout和stderr
cron
,僅將stderr發送到logger
,您可以使用這樣的構造,我相信其他人會改進:1 */8 * * * ( /path/to/myprog 2>&1 1>&3 | logger -p user.debug -t 'myprog' ) 3>&1
在我看來,您正在創建 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