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