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

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

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

  • Как обращаться с обратным пространством во время чтения?
  • Добавление вертикального пространства после команды в bash
  • Скрипт для разделения строки
  • Почему эта команда ffmpeg работает в bash, а не zsh?
  • Переименовать маску файла BASH с помощью счетчика
  • Каков наиболее ресурсоэффективный способ подсчета количества файлов в каталоге?
  • Есть что-то вроде ловушки времени?

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

  • Перенос связывания труб и перенаправления с дизъюнктами, конъюнктами и т. Д.?
  • Как передать логику в скрипте и поддерживать читаемость?
  • Как использовать оператор case для обработки нескольких возвращаемых значений
  • находить командный вывод пустым при перенаправлении в файл
  • Может ли замена замещения Bash использоваться как часть расширения аргумента?
  • Какова серьезность нового использования bash (shellshock)?
  • 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 - лучшая ОС в мире.