Ограничение времени для сценария bash

У меня есть сценарий bash, и я хотел бы установить для него ограничение по времени. Например, если скрипты работают дольше 50, выйдите с 0. Это должно быть сделано внутри скрипта, я не могу изменить команду, вызванную сценарием.

Какой был бы лучший способ сделать это?

Есть что-то вроде ловушки времени?

Я мог бы поместить весь код внутри цикла, но в этом случае это не вариант.

2 Solutions collect form web for “Ограничение времени для сценария bash”

Кажется, что на это уже ответили в другом месте, но вот что вы можете сделать.

Это команда, которая возвращает количество секунд, в течение которых эта команда была запущена (добавленные значения s во время возвращают только секунды).

ps -p "<process-id>" -o times= 

Вам также может понадобиться

 pgrep <name-of-the-script> 

Или, вообще говоря,

 ps -p "$(<name-of-the-script>)" -o times= 

для получения идентификатора процесса.

Затем вы назначаете результат переменной и проверяете ее так часто, как хотите.

Вам нужна обертка.

Наиболее очевидным является переименование исходного сценария и его место для создания сценария оболочки, который будет вызывать оригинал с таймаутом. Вариант этого заключается в том, чтобы создать ссылку с другим именем для самого скрипта, и способ вызова сценария будет решать, что происходит в нем. Это должно быть ясно через мгновение.

Если ваш скрипт вызывается без параметров, вы можете добавить эту внутреннюю оболочку в свой скрипт. Он снова вызовет себя с timeout и с переключателем в параметре $1 .

 #!/usr/bin/env bash TIMEOUT=10 WRAPPER=FALSE if [ "$1" != FALSE ]; then timeout "$TIMEOUT" "$0" "$WRAPPER" exit fi #the proper script echo Here\'s the original script starting. sleep 11 echo End of the original script. 

Поэтому, возвращаясь к предыдущему решению, вы можете использовать $0 чтобы увидеть, как был вызван сценарий. Это был файл или ссылка на него?

Если вы не хотите или не можете создать новый исполняемый файл / ссылку, а исходный вызов использует параметры, доступны другие ключи. Например, может использоваться временный файл. Это потребует некоторых угловых случаев, требующих очистки этого файла, если что-то пойдет не так. Вы также можете использовать PPID в качестве переключателя. Если родительская команда совпадает с дочерней, то она выполняет собственно скрипт, иначе она выполняет себя с таймаутом.

Linux и Unix - лучшая ОС в мире.