Можно ли запустить скрипт из bash (например, python) со временем завершения, а это означает, что если этот скрипт выполняется дольше, чем X секунд, завершить его?
1 ответ
Да, есть возможность запустить скрипт bash с тайм-аутом для его завершения. Вы можете сделать это:
1. Используя таймаут :
Он запускает команду с ограничением по времени. Общий синтаксис включает в себя:
timeout signal duration command/script arguments
где :
- сигнал - имя сигнала или соответствующий номер. См человек 7 сигнал
- Duration - время ожидания, указанное в числах с суффиксом
sдля секунд,mдля минут,hдля часов,dдля дней. По умолчанию это секунды, когда вы указываете только номер. В качестве примера скажем, что вы хотите прервать выполнение сценария через 2 минуты, а затем:
timeout 2m /path/to/script arg1 arg2NOTE. Сигналом тайм-аута по умолчанию являетсяSIGTERMдля которого некоторые процессы не завершаются. В этом случае нам нужно использовать сигналSIGKILLчтобы убить процесс.timeout -s KILL 2m /path/to/script arg1 arg2ИЛИ ЖЕ
timeout -k 30 2m /path/to/slow-command arg1 arg2В этом случае тайм-аут сначала отправляет сигнал
SIGTERMпосле начального тайм-аута в 2 минуты. Затем ждет другой тайм-аут 30 секунд и отправляетSIGKILLпроцессу, если он все еще работает.
2. У меня нет команды timeout :
Ну, есть много альтернатив или обходных путей, если по какой-то причине вы не можете использовать timeout . Это :
Состояние
sleepпотомkill/path/to/script arg1 arg2 & sleep 2m ; kill $!Аварийные сигналы Perl (это можно использовать в последовательном скрипте.):
perl -e "alarm 120; exec @ARGV" "/path/to/script arg1 arg2"С помощью команды ожидаем :
time_out=120 command="/path/to/script arg1 arg2" expect -c " set echo \"-noecho\"; set timeout $time_out; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 } "
Не стесняйтесь добавлять дополнительные детали.
