Каков наиболее эффективный способ регистрации ошибок сценария оболочки 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 || error_exit $LINENO в каждой строке моего скрипта, чтобы он работал.
Хотя с объемной заменой vim это может быть намного проще, но все же это похоже на неуклюжие решения.

Итак, есть ли более разумный способ выполнить ту же задачу?

2 Solutions collect form web for “Каков наиболее эффективный способ регистрации ошибок сценария оболочки crontab с ошибкой?”

В зависимости от количества информации о регистрации, которую вы ожидаете произвести, может потребоваться использовать стандартный инструмент logger , чтобы записать его в syslog пользователя в /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 .


Если вы хотите различать stdout и stderr в своем задании cron , отправляя только stderr в logger , вы можете использовать такую ​​конструкцию, что я уверен, что другие улучшатся:

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

Мне кажется, что вы создаете скрипт Bash, поэтому воспользуйтесь встроенной trap 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 
  • Отображать заголовки с помощью vimdiff или vim -d
  • Супервизор: нет такого файла или каталога, даже если он существует
  • статистика не работает с пробелами?
  • Вывод в переменной не должен интерпретироваться как команда
  • Игнорировать специальные символы в сравнении с сценарием оболочки
  • Как конденсировать подкаталоги
  • Доступ к экранам назад и вперед через скрипт bash
  • что означает «^ $ 1» в сценарии оболочки?
  • изменить шаблон, удалив пробелы?
  • запускать несколько значений из файла по одной команде один за другим
  • Выход, который я получаю через «echo», работает как команда при вставке в терминал, но не в скрипте
  • Linux и Unix - лучшая ОС в мире.