Bash запись FAQ № 68: "Как я выполняю команду и имею ее аварийное прекращение работы (тайм-аут) после N секунды?"
СНАЧАЛА проверьте, может ли команда, которую Вы выполняете, быть сказана тайм-ауту непосредственно. Методы, описанные здесь, являются "hacky" обходными решениями, чтобы вынудить команду завершиться после того, как определенное время протекло. Конфигурирование Вашей команды правильно всегда предпочтительно для альтернатив ниже.
Если команда не имеет никакой собственной поддержки остановки после требуемого времени, то лучшие альтернативы являются некоторыми внешними командами, названными тайм-аутом и doalarm. Некоторые дистрибутивы Linux предлагают tct версию
timeout
как пакет. Существует также версия GNU тайм-аута, включенного в недавние выпуски coreutils.
Как намекнули в этом вопросе, ответ настраивает a trap
на ERR
сигнал - в основном set -e
соответствует trap 'exit' ERR
. Таким образом к, например, ошибки журнала, но продолжают выполнение, используют
trap 'logger -t myscriptname "Command $BASH_COMMAND exited with code $?"' ERR
В ударе, переменной $BASH_COMMAND
содержит незаконную команду. $?
содержит код выхода последней выполняемой команды - отмечают это, если Вы хотите выполнить несколько действий, например. logger ...; echo $?
$?
будет содержать logger
код выхода, нет $BASH_COMMAND
один, таким образом, Вам, вероятно, придется сохранить его в переменной сначала, например.
trap 'EXITCODE=$?; logger -t "Command $BASH_COMMAND exited with code $EXITCODE"; echo "$BASH_COMMAND at line $LINENO exited with code $EXITCODE"' ERR
Конечно, Вы могли бы быть более обеспеченным объявлением функции и передачей его $?
и $BASH_COMMAND
вместо такой длинной линии!