Як обмежити час роботи програми в Linux?


10

У мене є кілька моделей, до яких потрібно звернутися python simulate.py <parameter list>. Проблема цих симуляцій полягає в тому, що деякі з них зависають без запиту, що заважає мені запускати їх у пакеті з простим сценарієм.

Що мені знадобиться, це певна форма команди "run-time-constraint", яка автоматично вбиває процес (бажано, практично натискаючи Ctrl + C , але я думаю, що просте вбивство також зробиться) через визначений час, якщо процес не закінчився витончено сам по собі.

Звичайно, я можу написати сам такий сценарій, але я підозрюю, що хтось зробив це вже до мене, тому мені не доведеться винаходити години, що витрачаються на колесо ps, timeі керуватися посібниками.

Відповіді:


15

Потенційне рішення №1

Використовуйте timeoutкоманду:

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

Ви також можете ввести timeoutкоманду в команду, killякщо процес не зупинився через деякий час.

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

Це зачекає до 20 секунд після того, як процес sleep 100повинен був зупинитися, якщо він все ще працює, то timeoutнадішле йому killсигнал.

Потенційне рішення №2

Альтернативним способом, хоча більш ризикованим є такий спосіб:

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

Знайдено цю техніку в Stack Overflow у запитанні: Обмеження часу роботи програми в Linux . Конкретно ця відповідь .

ПРИМІТКА. Згідно з коментарем @mattdm вищевказаний метод може бути ризикованим, враховуючи, що він припускає, що нових процесів не було запущено з часу вашого процесу. Таким чином, нові PID не призначаються. Враховуючи це, цей підхід, ймовірно, не повинен використовуватися, але тут лише як орієнтир для загального підходу до проблеми. timeoutМетод є найкращим варіантом з 2.


Але тоді буде гарантовано, що сценарій завжди займе весь цей час. У моєму випадку це не 1 секунда, а швидше 15 хвилин.
Адам Річковський

Але інше рішення, знайдене в цьому питанні, має бути саме тим, що мені потрібно. Дякую!
Адам Річковський

2
Припустимо, myProgram закінчується за менший час, ніж sleep(не необгрунтоване припущення, оскільки мета - встановити максимально дозволений час виконання). Потім ви надсилаєте сигнал або до неіснуючого PID (не заподіяно реальної шкоди), ні до будь-якого випадкового процесу в системі (потенційно фатального).
CVn

1
@ MichaelKjörling, дякую за відшкодування. Я оновив свою відповідь на той самий коментар, що й ОП. Схоже, timeoutкоманда робить саме те, що шукає, чекаючи, коли ОП відповість на мої коментарі.
slm

@slm timeoutмає бути рішенням, яке мені потрібно. Я зараз тестую це
Адам Ріцковський

4

Я знайшов дещо - що трохи краще, ніж timeout: timelimit.

Він має ряд переваг; одне полягає в тому, що користувач може вручну перервати виконання, натиснувши "Ctrl + C".

timelimitПрограма доступна в репозиторії Debian.


1
Намагаючись зрозуміти відмінності в / ч тиммеліміт та таймаут. тайм-аут можна зупинити за допомогою Ctrl + C. Які ще є переваги?
slm

Що ж, мій тайм-аут не може. Я використовую Mint 14 (заснований на Ubuntu Quantal).
Адам Річковський

3

Ви можете налаштувати час процесора та інші речі ulimit, зокрема на процесорний час:

$ ulimit -t 60      # limit to 60 seconds
$ program

Дивіться це питання U&L Q&A: unix.stackexchange.com/a/4666/7453 . @Gilles дає хороший огляд використання ulimit для цієї мети.
slm

0

Bash використовує змінну, яку називають, $BASHPIDїї можна використовувати в такій ситуації, наприклад:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

Ви можете змінити аргумент у виклику sleepв do_face()до 100а 10й подивитися , що відбувається , коли дитина займає надто багато часу , щоб зробити його роботу по дому. Просто змініть виклик для сну, do_face()щоб зателефонувати вашому виконуваному файлу, і якщо це займе занадто довго, то сценарій вб'є його, 20секунди є обмежуючим значенням у цьому прикладі. Параметри можуть бути реалізовані таким чином, що це стає простим сценарієм для виклику і може бути викликаний іншим сценарієм у пакетній чи іншій формі. Обробка під-файлів для кожного одночасного процесу - це проблема, яку потрібно буде обробити, можливо, використовувати різні підручники ...

Примітка. На GNU Linux sleepможе приймати аргументи з плаваючою комою, такі як sleep 0.1спати десяту частину секунди.

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