Каков наиболее эффективный способ регистрации ошибок сценария оболочки 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 
  • Сообщения на новом терминале после использования nohup
  • Перепишите аргументы перед передачей их команде
  • Shell-скрипт: весь каталог удаленного ftp-сервера
  • bash, если не несколько условий без подоболочки?
  • как добавить строку в файл / etc / sudoers с помощью скрипта оболочки (50servers)?
  • Как удалить каталоги в правильном порядке, чтобы удалить пустые?
  • Прочитать все файлы в папке и подпапках - прогресс и размер
  • Существуют ли какие-либо стандарты / документы, которые рассказывают мне, как создавать такие полезные справочные сообщения?
  • В чем разница между сравнением внутри, если использовать два или один равный (=)
  • Как подписать скрипт Bash в качестве клиента MQTT
  • Как перенаправить unzip -v вывод в файл журнала в сценарии оболочки
  • Cron не может получить доступ к моему домашнему каталогу при выходе из системы
  • Interesting Posts

    Использование gettext в настройках

    Нестабильное монтирование с CIFS и NFS

    сплит 60GB плоский файл с записями, иногда охватывающих несколько строк

    Автоматизация восстановления документов Libreoffice

    MSYS2: ulimit: максимальные пользовательские процессы: невозможно изменить предел: недопустимые аргументы

    Как отслеживать жизненный цикл потоков ядра, следуя созданию и переключению?

    vi требуется два нажатия <enter>, а не один

    Как найти общее имя для конкретного глифа?

    GSM-модем не создает файл / dev / ttyUSB

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

    Почему у меня нет папки и файла с тем же именем?

    SET завершился с ошибкой на устройстве wlp2s0; Операция не поддерживается

    Инструмент Diff с хорошим выходом, например kdiff3

    Unix Useradd – список пользователей, добавленных в систему

    Только grep для строк, содержащих только алфавитные символы

    Linux и Unix - лучшая ОС в мире.