记录 crontab shell 脚本错误以及错误发生时间?

记录 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 的批量替换可能会容易得多,但它看起来仍然是一个笨拙的解决方案。

那么,是否有更智能或更有效的方法来完成相同的任务?

答案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

答案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.noticeuser.infouser.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

相关内容