Как да използвате командата за изчакване в Linux

Добре, това е достатъчно компютърно време. Можете да дадете времеви ограничения на процесите, като зададете максимално време, за което могат да работят с командата timeout. Ето урок за поставяне на ограничения за стартиране на програми с тази команда.

Какво прави времето за изчакване за вас?

Командата за изчакване ви позволява да задайте ограничение за продължителността на времето програма ще се изпълнява за. Но защо бихте искали да направите това?

Един случай е, когато знаете точно колко време искате да продължи даден процес. Често срещан случай на използване е да имате време за изчакване да контролира програма за регистриране или заснемане на данни, така че регистрационните файлове да не поглъщат безмилостно пространството на вашия твърд диск.

Друг случай е, когато не знаете колко дълго искате да работи даден процес, но знаете, че не искате той да работи за неопределено време. Може да имате навика да настройвате изпълнявани процеси, да минимизирате прозореца на терминала и да забравяте за тях.

Някои програми – дори прости помощни програми – могат да генерират мрежов трафик на нива, които могат да попречат на производителността на вашата мрежа. Или могат да обвържат ресурсите на целево устройство, забавяйки неговата производителност. (пинг, гледам ви.) Оставянето на тези видове програми да работят за продължителни периоди, докато сте далеч от компютъра си, е лоша практика.

изчакването е част от GNU Core Utils така че Linux и Unix-подобни операционни системи, като macOS, всички имат вградено време за изчакване. Няма нищо за инсталиране; можете да го използвате направо от кутията.

Първи стъпки с изчакване

Ето един прост пример. Например, с опциите на командния ред по подразбиране, командата ping ще работи, докато не я спрете, като натиснете Ctrl+C. Ако не го прекъснеш, то просто ще продължи.

ping 192.168.4.28

Като използваме изчакване, можем да се уверим, че пингът не се изпълнява непрекъснато, като прегръща честотната лента на мрежата и досаждава каквото и да е устройство, което се пингува.

  Как да архивирате снимки от мобилно устройство на Linux с помощта на Daemon Sync

Следващата команда използва изчакване, за да ограничи ping във времето. Разрешаваме 15 секунди време за изпълнение за пинг.

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 все още нараства по размер.  Ще е необходимо прибързано Ctrl+C, за да спре tcpdump.</p>
<p>Проверката на размера на capture.txt с ls показва, че той нарасна до 209K за броени секунди.  Този файл расте бързо!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Какво стана? Защо времето за изчакване не спря tcpdump?

  Как да използвате и инсталирате Snap пакети на Linux

Всичко е свързано със сигнали.

Изпращане на правилния сигнал

Когато времето за изчакване иска да спре програма, тя изпраща Сигнал 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> 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 винаги оставя некролог с една дума в прозореца на терминала: „Убит“. Това не се случи в случая.

Извличане на изходния код на програмата

Добре работещите програми предават стойност обратно на обвивката, когато завършват. Това е известно като изходен код. Обикновено това се използва, за да се каже на обвивката – или на какъвто и да е процес, стартирал програмата – дали програмата е срещнала проблеми, докато се изпълнява.

  Как да използвате командата history в Linux

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

Тази команда позволява на ping да работи за пет секунди. Той пингува компютър, наречен Nostromo, който е в тестовата мрежа, използвана за изследване на тази статия.

timeout 5 ping Nostromo.local

Командата се изпълнява за пет секунди и времето за изчакване я прекратява. След това можем да проверим изходния код с помощта на тази команда:

echo $?

Кодът за излизане е 124. Това е стойността, която времето за изчакване използва, за да покаже, че програмата е прекратена с помощта на SIGTERM. Ако SIGKILL прекрати програмата, изходният код е 137.

Ако прекъснем програмата с Ctrl+C, изходният код от изчакването е нула.

timeout 5 ping Nostromo.local
echo $?

Ако изпълнението на програмата приключи, преди времето за изчакване да я прекрати, таймаутът може да предаде кода за изход от програмата обратно към обвивката.

За да се случи това, програмата трябва да спре от само себе си (с други думи, не е прекратена от изчакване) и трябва да използваме опцията –preserve-status.

Ако използваме опцията -c (брой) със стойност пет, ping ще задейства само пет заявки. Ако дадем време на изчакване от една минута, ping определено ще приключи сам. След това можем да проверим изходната стойност с помощта на ехо.

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

ping завършва своите пет ping заявки и прекратява. Изходният код е нула.

За да проверим дали изходният код идва от ping, нека принудим ping да генерира различен изходен код. Ако се опитаме да изпратим заявки за ping до несъществуващ IP адрес, ping ще се провали с код за изход за грешка. След това можем да използваме ехо, за да проверим дали изходният код е различен от нула.

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

Командата ping очевидно не може да достигне до несъществуващо устройство, така че съобщава за грешката и се затваря. Изходният код е два. Това е кодът за изход, който ping използва за общи грешки.

Задаване на основни правила

времето за изчакване е свързано с предоставянето на някои граници на работещите програми. Ако има опасност регистрационните файлове да превземат твърдия ви диск или да забравите, че сте оставили работещ мрежов инструмент, увийте ги във времето за изчакване и оставете компютъра да се саморегулира.