Bash

使用發生錯誤的時間記錄 crontab shell 腳本錯誤?

  • September 11, 2019

記錄 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.noticeoruser.infouser.debug。請注意,其中一些也可能被寫入/var/log/messages/var/log/syslog


如果您想在工作中區分stdoutstderrcron,僅將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

引用自:https://unix.stackexchange.com/questions/219191