Можно ли запустить скрипт из 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 arg2
- NOTE. Сигналом тайм-аута по умолчанию является- 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 } "
Не стесняйтесь добавлять дополнительные детали.
