Что произойдет, если вызванная программа вернет код выхода, такой же, как команда тайм-аута?

#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 для прерывания длительной программы. С сигналами никогда не знаешь, кто посылал сигнал. Это не относится конкретно к тайм-аутам.