Возвращаемое значение функции тайм-аута

9

Я использую функцию тайм-аута в Debian для ожидания моего скрипта 5 секунд. Прекрасно работает, но у меня проблема в том, что мне нужно возвращаемое значение. Как 1 для времени ожидания и 0 для отсутствия времени ожидания Как я собираюсь это сделать?

Посмотрите на мой код:

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
# here i need the return of timeout

Как вы видите, мой connect_script -x 'status' возвращает статус в виде строки и выводит его на экран (возможно, вы этого не видите). Причина этой проблемы в том, что если сервер (для connect_script) остановлен, скрипт ничего не делает , Вот почему мне нужно время для этого. И когда истечет время ожидания, я хочу перезагрузить сервер. Я могу сделать это, но я понятия не имею, как я могу видеть, истекло ли это время или нет ...

Нуль
источник

Ответы:

19

Если timeoutвремя истекло, он выходит со статусом 124 ; Вы можете проверить это, чтобы определить, истек ли срок действия сценария или нет.

Стивен Китт
источник
Да спасибо. Я скучаю по этому в руководстве. @ Кристофер опубликовать ответ, который работает для меня. Я не знаю $? синтаксис. Так что оба ваших ответа верны;)
Ноль
6

По инструкции ( man timeout):

Тайм-аут синопсиса [ОПЦИЯ] НОМЕР [СУФФИКС] КОМАНДА [АРГ] ...

[...] Если время команды истекло, выйдите со статусом 124. В противном случае выйдите со статусом КОМАНДА

Объедините это со знанием того, что статус выхода или возвращаемое значение хранятся в переменной $?, и мы имеем ...

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?

Затем вы можете выполнить дополнительную обработку, основываясь на значении $RETVAL, которое будет равно 124, если время ожидания истекло, или на каком-либо другом значении, основанном на состоянии выхода connect_script.

Кристофер
источник
1

Возвращаемое значение timeoutзависит от сигнала, который вы используете для прекращения дочернего процесса.

SIGTERM возвращает 124:

timeout -s SIGTERM 1 sleep 2; echo $?

Но SIGKILLвозвращает

timeout -s SIGKILL 1 sleep 2; echo $?

Смотрите страницу руководства:

Если время команды истекло, а параметр --preserve-status не задан, выйдите со статусом 124. В противном случае выйдите со статусом COMMAND. Если сигнал не указан, отправьте сигнал TERM по истечении времени ожидания. Сигнал TERM убивает любой процесс, который не блокирует и не перехватывает этот сигнал. Может быть необходимо использовать сигнал KILL (9), поскольку этот сигнал не может быть перехвачен, и в этом случае состояние выхода будет 128 + 9, а не 124.

ceving
источник