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

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

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

  • grep фильтрует все линии плюс один перед каждым нажатием
  • Как вывести предложение для пользователя принять и использовать в качестве входных данных?
  • Вызов скрипта с sudo игнорирует shebang
  • Установка переменной, значение которой зависит от другой переменной
  • Завершение слов на экране, как в VIM (Bash или Tmux)
  • Есть ли какая-нибудь книга, учебник по очень сложным сценариям оболочки
  • Есть что-то вроде ловушки времени?

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

  • Скрипт для быстрого тестирования всех клавиш клавиатуры
  • Как использовать bash для архивирования всех каталогов?
  • Завершение команды не завершает файлы в текущем каталоге
  • Если [является встроенным и [[является ключевым словом, то что есть ((?
  • Какова цель хеш-команды?
  • Есть ли способ включить Ctrl + L для очистки экрана при установке «set -o vi»?
  • 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 - лучшая ОС в мире.