#bash #shell #timeout #sh
Вопрос:
Я использую команду timeout в оболочке Linux для вызова программы с определенным временем ожидания.
И из руководства по командам тайм-аута он возвращает код выхода 124, если происходит тайм-аут, и возвращает код выхода программы, если тайм-аут не происходит. К сожалению, программа, которую я вызываю, в некоторых случаях также возвращает код выхода 124.
Поэтому я просто хочу спросить, есть ли у нас какой-либо способ определить, является ли 124 из команды или программы тайм-аута?
код:
timeout 10s program 2>amp;1 | tee log.txt
if [ "${PIPESTATUS[0]}" == 124 ]; then
# do something
fi
Спасибо
Комментарии:
1. Я предлагаю вам удалить sh и тег bash . Они, похоже, не имеют отношения к вашему вопросу.
Ответ №1:
Если вы это сделаете, т. е.
timeout --preserve-status 1 sleep 4
вы получите статус 143, что означает, что команда была завершена SIGTERM (128 15==143). Поскольку команда не должна возвращать значения больше 127 для передачи состояния, это может быть использовано в вашем случае для устранения неоднозначности между временем ожидания и «реальным» статусом выхода.
Это предполагает, что вы используете ту timeout
команду, которая поставляется с GNU coreutils.
Комментарии:
1. Тогда как мы отличаем фактический SIGTERM от тайм-аута?
2. Спасибо @user1934428 , 127-это ключ.
3. Я просто проверяю программу, которую я вызываю, она никогда не возвращает значение больше 127. И если я использую опцию —сохранить статус и получу код выхода 134, это поможет мне отличить его от 124.
4. @oguzismail : Я думаю, что это настоящий SIGTERM. Скорее всего,
timeout
использует SIGTERM для прерывания длительной программы. С сигналами никогда не знаешь, кто посылал сигнал. Это не относится конкретно к тайм-аутам.