Як використовувати команду timeout в Linux

Гаразд, достатньо комп’ютерного часу. За допомогою команди timeout ви можете встановити обмеження по часу процесів, встановивши максимальний час, протягом якого вони можуть працювати. Ось підручник із встановлення обмежень на запуск програм за допомогою цієї команди.

Що робить для вас тайм-аут?

Команда тайм-аут дозволяє встановити обмеження на тривалість програма буде запущена для. Але чому ти хочеш це зробити?

Один із випадків — це коли ви точно знаєте, скільки часу ви хочете, щоб процес тривав. Звичайним випадком використання є контроль тайм-ауту над програмою ведення журналів або збору даних, щоб файли журналів не поглинали невпинно місце на вашому жорсткому диску.

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

Деякі програми, навіть прості утиліти, можуть генерувати мережевий трафік на рівнях, які можуть зашкодити продуктивності вашої мережі. Або вони можуть зв’язати ресурси на цільовому пристрої, сповільнюючи його продуктивність. (Пінг, я дивлюся на вас.) Залишати подібні програми працювати протягом тривалого періоду, поки ви не з комп’ютером, є поганою практикою.

тайм-аут є частиною Основні утиліти GNU тому Linux і Unix-подібні операційні системи, такі як macOS, мають вбудований тайм-аут. Немає нічого для встановлення; Ви можете використовувати його прямо з коробки.

Початок роботи з тайм-аутом

Ось простий приклад. Наприклад, із параметрами командного рядка за замовчуванням команда ping працюватиме, доки ви не зупините її, натиснувши Ctrl+C. Якщо ви не перервете його, воно просто продовжиться.

ping 192.168.4.28

Використовуючи тайм-аут, ми можемо переконатися, що ping не запускається постійно, пережовуючи пропускну спроможність мережі та докучаючи будь-якому пристрою, на який запитують.

Ця наступна команда використовує тайм-аут для обмеження часу ping. Ми даємо 15 секунд часу виконання для ping.

timeout 15 ping 192.168.4.28

Через 15 секунд тайм-аут припиняє сеанс ping, і ми повертаємося до командного рядка.

Використання тайм-ауту з іншими одиницями часу

Зауважте, що нам не потрібно було додавати «s» після 15. тайм-аут припускає значення в секундах. Ви можете додати «s», але це насправді не має значення.

Щоб використовувати значення часу, що вимірюється в хвилинах, годинах або днях, додайте «m», «h» або «d».

Щоб ping запускався протягом трьох хвилин, скористайтеся такою командою:

timeout 3m ping 192.168.4.28

ping працюватиме протягом трьох хвилин, перш ніж настане тайм-аут і зупинить сеанс ping.

Обмеження захоплення даних з тайм-аутом

Деякі файли збору даних можуть дуже швидко розростатися. Щоб такі файли не ставали громіздкими або навіть проблемними за розміром, обмежте час, протягом якого програма захоплення може працювати.

У цьому прикладі ми використовуємо tcpdump, a захоплення мережевого трафіку інструмент. На тестових машинах, на яких досліджувалася ця стаття, tcpdump вже був встановлений в Ubuntu Linux і Fedora Linux. Його потрібно було встановити на Manjaro Linux і Arch Linux за допомогою такої команди:

sudo pacman -Syu tcpdump

Ми можемо запустити tcpdump протягом 10 секунд з його параметрами за замовчуванням і перенаправити його вихід у файл під назвою capture.txt за допомогою такої команди:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt у вікні терміналу” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump має власні параметри збереження захопленого мережевого трафіку до файлу. Це швидкий злом, оскільки ми обговорюємо тайм-аут, а не tcpdump.)</p>
<p>tcpdump починає захоплювати мережевий трафік, і ми чекаємо 10 секунд.  І 10 секунд приходить і йде, і tcpdump все ще працює, а capture.txt все ще збільшується в розмірі.  Щоб зупинити tcpdump, знадобиться поспішне натискання Ctrl+C.</p>
<p>Перевірка розміру capture.txt за допомогою ls показує, що він зріс до 209K за лічені секунди.  Цей файл швидко зростав!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Що сталося? Чому тайм-аут не зупинив tcpdump?

Це все пов’язано із сигналами.

Надсилання правильного сигналу

Коли тайм-аут хоче зупинити програму, вона надсилає Сигнал SIGTERM. Це ввічливо просить програму припинити. Деякі програми можуть ігнорувати сигнал SIGTERM. Коли це станеться, ми повинні вказати тайм-аут трохи сильніше.

Ми можемо зробити це, попросивши тайм-аут замість цього надіслати сигнал SIGKILL.

Сигнал SIGKILL не можна «зловити, заблокувати чи проігнорувати» — він завжди проходить. SIGKILL не ввічливо просить програму зупинитися. SIGKILL ховається за рогом із секундоміром і катушкою.

Ми можемо використовувати параметр -s (сигнал), щоб вказати тайм-аут для відправки сигналу SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt у вікні терміналу” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Цього разу, щойно мине 10 секунд, tcpdump зупиняється.</p>
<p><p>Цього разу, щойно мине 10 секунд. img src=” http:=”” width=”646″ height=”197″/></p>
<h2 role=Спочатку ввічливо запитуйте

Ми можемо попросити тайм-аут, щоб спробувати зупинити програму за допомогою SIGTERM, і надіслати SIGKILL, лише якщо SIGTERM не працює.

Для цього ми використовуємо опцію -k (убити після). Опція -k вимагає значення часу як параметра.

У цій команді ми просимо тайм-аут, щоб дати dmesg працювати протягом 30 секунд, а потім завершити його за допомогою сигналу SIGTERM. Якщо dmesg все ще працює через 40 секунд, це означає, що дипломатичний SIGTERM був проігнорований, і тайм-аут має надіслати SIGKILL, щоб завершити роботу.

dmesg — це утиліта, яка може стежити за повідомленнями кільцевого буфера ядра і відобразити їх у вікні терміналу.

timeout -k 40 30 dmseg -w

dmesg працює протягом 30 секунд і зупиняється, коли отримує сигнал SIGTERM.

Ми знаємо, що не SIGKILL зупинив dmesg, тому що SIGKILL завжди залишає некролог з одного слова у вікні терміналу: «Убитий». У цьому випадку цього не сталося.

Отримання коду виходу з програми

Правильні програми передають значення назад в оболонку, коли вони завершуються. Це відомо як код виходу. Зазвичай це використовується, щоб повідомити оболонці — або будь-якому процесу, який запустив програму — чи виникли проблеми з програмою під час її запуску.

тайм-аут надає власний код виходу, але нас це не хвилює. Нас, мабуть, більше цікавить код виходу з процесу, який контролює тайм-аут.

Ця команда дозволяє ping виконуватися протягом п’яти секунд. Він виконує запит на комп’ютер під назвою Nostromo, який знаходиться в тестовій мережі, яка була використана для дослідження цієї статті.

timeout 5 ping Nostromo.local

Команда виконується протягом п’яти секунд, а час очікування припиняє її виконання. Потім ми можемо перевірити код виходу за допомогою цієї команди:

echo $?

Код виходу 124. Це значення тайм-ауту, яке вказує на завершення програми за допомогою SIGTERM. Якщо SIGKILL завершує програму, код виходу дорівнює 137.

Якщо ми перервемо програму за допомогою Ctrl+C, код виходу з тайм-ауту дорівнює нулю.

timeout 5 ping Nostromo.local
echo $?

Якщо виконання програми закінчується до закінчення часу очікування, тайм-аут може передати код виходу з програми назад в оболонку.

Щоб це відбулося, програма повинна зупинитися самостійно (іншими словами, вона не припиняється через тайм-аут), і ми повинні використовувати опцію –preserve-status.

Якщо ми використовуємо параметр -c (count) зі значенням п’ять, ping запускатиме лише п’ять запитів. Якщо ми даємо тайм-аут в одну хвилину, ping точно припиниться сам. Потім ми можемо перевірити вихідне значення за допомогою echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

ping завершує свої п’ять запитів ping і завершується. Код виходу дорівнює нулю.

Щоб переконатися, що код виходу надходить від ping, давайте примусимо ping генерувати інший код виходу. Якщо ми спробуємо надіслати запити ping на неіснуючу IP-адресу, ping не вдасться з кодом виходу з помилкою. Потім ми можемо використовувати echo, щоб перевірити, чи не нульовий код виходу.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

Очевидно, що команда ping не може досягти неіснуючого пристрою, тому повідомляє про помилку та закривається. Код виходу – два. Це код виходу, який ping використовує для загальних помилок.

Встановлення основних правил

Тайм-аут – це надання певних обмежень для запущених програм. Якщо є небезпека, що файли журналів можуть перевантажити ваш жорсткий диск або ви можете забути, що залишили запущений мережевий інструмент, загорніть їх у тайм-аут і дайте комп’ютеру саморегулюватися.