2015-03-08 3 views
2

Иногда мои Баш скрипты висят и держать без видимой причиныВозможно ли установить тайм-аут из сценария bash?

Так что они на самом деле могут висеть навсегда (процесс сценария будет работать, пока я не убью его)

Можно ли объединить в Баш скрипт тайм-аут механизм для выхода из программы после, например, через 1/2 часа?

+0

Разве не имеет смысла находить причину ошибочного поведения? – arkascha

+0

да, но я хочу узнать, что такое тайм-аут. – maihabunash

+1

Ну, создайте оболочку запуска: этот wapper запускает ваш скрипт, принимает свой идентификатор процесса и использует его для регистрации задания cron через 30 минут. Задача cron выполняет команду kill на идентификаторе процесса. – arkascha

ответ

3

Этот Баш-единственный подход инкапсулирует все тайм-аут внутри вашего скрипта, запустив функцию в качестве фонового задания для обеспечения таймаута:

#!/bin/bash 

Timeout=1800 # 30 minutes 

function timeout_monitor() { 
    sleep "$Timeout" 
    kill "$1" 
} 

# start the timeout monitor in 
# background and pass the PID: 
timeout_monitor "$$" & 
Timeout_monitor_pid=$! 

# <your script here> 

# kill timeout monitor when terminating: 
kill "$Timeout_monitor_pid" 

Обратите внимание, что функция будет выполняться в отдельном процессе. Следовательно, PID контролируемого процесса ($$) должен быть передан. Для краткости я оставил обычную проверку параметров.

+0

Будет ли фоновый процесс не поддерживать основной процесс? Значит, это будет ВСЕГДА тайм-аут, даже если скрипт выполнен полностью? – AK47

+0

@Alan: Да, это всегда будет тайм-аут. Нет, основной процесс не будет работать, но фоновый процесс будет. Если это проблема для вас, вы можете сохранить «PID» фонового процесса из «$!» И убить его до завершения основной программы. Или используйте обработчик 'EXIT'. Или используйте «тайм-аут» Гну, как предположил рици. –

+0

Ya - Хороший ответ. Хранение тайм-аута PID и его убийство должны выполнять эту работу. Возможно, вы включили это в свой ответ, это один из первых, который появляется в Google. (Я регистрирую, не истекает ли сценарий, так что мне нужен фоновый процесс, чтобы умереть, если скрипт выполняется полностью заранее) – AK47

5

Если у вас есть Gnu Coreutils, вы можете использовать timeout команду:

timeout 1800s ./myscript 

Чтобы проверить, если тайм-аут произошел проверить код состояния:

timeout 1800s ./myscript 

if (($? == 124)); then 
    echo "./myscript timed out after 30 minutes" >>/path/to/logfile 
    exit 124 
fi 
+0

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

Смежные вопросы