Запустіть скрипт з bash і надайте час завершення [дублювати]


6

На це запитання вже є відповідь:

Чи можна запустити скрипт з bash (наприклад, python) з терміном завершення, що означає, що якщо цей сценарій виконується довше, ніж X секунд, завершіть його?

Відповіді:


5

Так, можна запустити скрипт bash з тайм-аутом його завершення. Ви можете зробити це за допомогою:

1. Використання час вийшов :

Він запускає команду з обмеженням часу. Загальний синтаксис включає:

timeout signal duration command/script arguments

де:

  • сигнал - ім'я сигналу або відповідний номер. Подивитися людина 7 сигналу
  • Тривалість - Timeout, вказана в цифрах з суфіксом as 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 секунд і надсилає a SIGKILL процес, якщо він все ще працює.

2. Я не мають timeout команда:

Ну, Є багато альтернатив або обхідних шляхів, якщо з якоїсь причини ви не можете використовувати timeout. Це:

  1. Стан sleep потім kill :

       /path/to/script arg1 arg2 & sleep 2m ; kill $!
    
  2. Сигнали Perl (це можна використовувати в послідовному сценарії.):

       perl -e "alarm 120; exec @ARGV" "/path/to/script arg1 arg2"
    
  3. Використання очікувати команда:

       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 } "
    

Ви можете додавати більше деталей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.