Jak używać polecenia limitu czasu w systemie Linux

OK, wystarczy czasu na komputerze. Możesz nadać procesom ograniczenia czasowe, ustawiając maksymalny czas, przez jaki mogą działać za pomocą polecenia timeout. Oto samouczek dotyczący ograniczania uruchamiania programów za pomocą tego polecenia.

Co robi dla Ciebie limit czasu?

Polecenie limitu czasu umożliwia ustawić limit czasu program będzie działał dla. Ale dlaczego chcesz to zrobić?

Jeden przypadek to sytuacja, w której wiesz dokładnie, jak długo ma działać proces. Typowym przypadkiem użycia jest kontrolowanie limitu czasu programu rejestrującego lub przechwytującego dane, aby pliki dziennika nie zajmowały nieustannie miejsca na dysku twardym.

Innym przypadkiem jest sytuacja, gdy nie wiesz, jak długo chcesz, aby proces działał, ale wiesz, że nie chcesz, aby działał w nieskończoność. Możesz mieć zwyczaj ustawiania uruchomionych procesów, minimalizowania okna terminala i zapominania o nich.

Niektóre programy – nawet proste narzędzia – mogą generować ruch w sieci na poziomach, które mogą utrudniać działanie sieci. Lub mogą związać zasoby na urządzeniu docelowym, spowalniając jego wydajność. (ping, patrzę na ciebie). Pozostawienie tego typu programów uruchomionych przez dłuższy czas, gdy jesteś z dala od komputera, jest złą praktyką.

limit czasu jest częścią Narzędzia GNU Core więc systemy operacyjne Linux i Unix, takie jak macOS, mają wbudowany limit czasu. Nie ma nic do zainstalowania; możesz go używać zaraz po wyjęciu z pudełka.

Pierwsze kroki z przekroczeniem limitu czasu

Oto prosty przykład. Na przykład, z domyślnymi opcjami wiersza poleceń, polecenie ping będzie działać, dopóki nie zatrzymasz go, naciskając Ctrl + C. Jeśli tego nie przerwiesz, po prostu pójdzie dalej.

ping 192.168.4.28

ping 192.168.4.28 w oknie terminala

Używając limitu czasu, możemy upewnić się, że ping nie działa i nie włącza się, pogarszając przepustowość sieci i nękając każde urządzenie, do którego jest wysyłane polecenie ping.

To następne polecenie używa limitu czasu do ograniczenia czasu ping. Dajemy 15 sekund czasu działania na ping.

timeout 15 ping 192.168.4.28

przekroczono limit czasu 15 ping 192.168.4.28 w oknie terminala

Po 15 sekundach limit czasu kończy sesję ping i wracamy do wiersza poleceń.

zakończona sesja ping w oknie terminala

Używanie limitu czasu z innymi jednostkami czasu

Zauważ, że nie musieliśmy dodawać „s” za 15. limitem czasu, przy założeniu, że wartość jest w sekundach. Możesz dodać „s”, ale to naprawdę nie ma znaczenia.

Aby użyć wartości czasu mierzonej w minutach, godzinach lub dniach, dodaj „m”, „h” lub „d”.

Aby ping działał przez trzy minuty, użyj następującego polecenia:

timeout 3m ping 192.168.4.28

timeout 3m ping 192.168.4.28 w oknie terminala

ping będzie działał przez trzy minuty, po czym upłynie limit czasu i zatrzyma sesję ping.

sesja ping uruchomiona w oknie terminala

Ograniczanie przechwytywania danych z przekroczeniem limitu czasu

Niektóre pliki przechwytywania danych mogą bardzo szybko urosnąć. Aby zapobiec nieporęczności lub nawet problematycznym rozmiarom takich plików, ogranicz czas, przez jaki może działać program przechwytujący.

W tym przykładzie używamy tcpdump, a przechwytywanie ruchu sieciowego narzędzie. Na maszynach testowych, na których badano ten artykuł, tcpdump był już zainstalowany w systemach Ubuntu Linux i Fedora Linux. Musiał być zainstalowany na Manjaro Linux i Arch Linux za pomocą następującego polecenia:

sudo pacman -Syu tcpdump

sudo pacman -Syu tcpdump w oknie terminala

Możemy uruchomić tcpdump przez 10 sekund z jego domyślnymi opcjami i przekierować jego dane wyjściowe do pliku o nazwie capture.txt za pomocą następującego polecenia:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump> capture.txt w oknie terminala ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> (tcpdump ma własne opcje zapisywania przechwyconego ruchu sieciowego do pliku. To szybki hack, ponieważ ponownie omawiamy limit czasu, a nie tcpdump.) </p>
<p> tcpdump zaczyna przechwytywać ruch sieciowy i czekamy 10 sekund.  I pojawia się i znika 10 sekund, a tcpdump nadal działa, a rozmiar pliku capture.txt wciąż rośnie.  Aby zatrzymać tcpdump, potrzeba pospiesznego Ctrl + C. </p>
<p> Sprawdzenie rozmiaru pliku capture.txt za pomocą ls pokazuje, że w ciągu kilku sekund urósł on do 209K.  Ten plik szybko się rozrastał! </p>
<pre> ls -lh capture.txt </pre>
<p> <img loading =

Co się stało? Dlaczego limit czasu nie zatrzymał tcpdump?

Wszystko ma związek z sygnałami.

Wysyłanie właściwego sygnału

Gdy limit czasu chce zatrzymać program, wysyła plik Sygnał SIGTERM. To grzecznie prosi program o zakończenie. Niektóre programy mogą ignorować sygnał SIGTERM. Kiedy tak się stanie, musimy ustawić limit czasu, aby był nieco bardziej zdecydowany.

Możemy to zrobić, prosząc o podanie limitu czasu, aby zamiast tego wysłać sygnał SIGKILL.

Sygnału SIGKILL nie można „złapać, zablokować ani zignorować” – zawsze dociera. SIGKILL nie prosi grzecznie o zatrzymanie programu. SIGKILL chowa się za rogiem ze stoperem i hukiem.

Możemy użyć opcji -s (signal), aby określić limit czasu na wysłanie sygnału SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump> capture.txt w oknie terminala ”width =” 646 ″ height = ”167 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Tym razem po upływie 10 sekund tcpdump zostaje zatrzymany. </p>
<p> < img ładowanie =

Najpierw uprzejmie prosić

Możemy poprosić o limit czasu, aby spróbować zatrzymać program za pomocą SIGTERM i wysłać SIGKILL tylko wtedy, gdy SIGTERM nie działa.

Aby to zrobić, używamy opcji -k (kill after). Opcja -k wymaga wartości czasu jako parametru.

W tym poleceniu prosimy o przekroczenie limitu czasu, aby dmesg działał przez 30 sekund, a następnie zakończył go sygnałem SIGTERM. Jeśli dmesg nadal działa po 40 sekundach, oznacza to, że dyplomatyczny SIGTERM został zignorowany i limit czasu powinien wysłać SIGKILL, aby zakończyć zadanie.

dmesg to narzędzie, które potrafi monitorować komunikaty bufora pierścieniowego jądra i wyświetl je w oknie terminala.

timeout -k 40 30 dmseg -w

timeout -k 40 30 dmseg -w w oknie terminala

dmesg działa przez 30 sekund i zatrzymuje się, gdy odbierze sygnał SIGTERM.

Wyjście z dmesg w oknie terminala

Wiemy, że to nie SIGKILL zatrzymał dmesg, ponieważ SIGKILL zawsze pozostawia jednowyrazowy nekrolog w oknie terminala: „Zabity”. W tym przypadku tak się nie stało.

Pobieranie kodu zakończenia programu

Po zakończeniu działania dobrze działające programy przekazują wartość z powrotem do powłoki. Nazywa się to kodem zakończenia. Zwykle służy do poinformowania powłoki – lub jakiegokolwiek innego procesu, który uruchomił program – czy wystąpiły problemy podczas działania programu.

timeout zapewnia własny kod zakończenia, ale może nas to nie obchodzić. Prawdopodobnie bardziej interesuje nas kod wyjścia z procesu, który kontroluje przekroczenie czasu.

To polecenie pozwala pingowi działać przez pięć sekund. Pinguje komputer o nazwie Nostromo, który znajduje się w sieci testowej, której użyto do zbadania tego artykułu.

timeout 5 ping Nostromo.local

timeout 5 ping do Nostromo.local w oknie terminala

Polecenie działa przez pięć sekund i kończy go limit czasu. Następnie możemy sprawdzić kod zakończenia za pomocą tego polecenia:

echo $?

wyjście ping i echo $?  w oknie terminala

Kod zakończenia to 124. Jest to wartość używana przez limit czasu do wskazania, że ​​program został zakończony za pomocą SIGTERM. Jeśli SIGKILL kończy program, kod zakończenia to 137.

Jeśli przerwiemy program za pomocą Ctrl + C, kod wyjścia z limitu czasu wynosi zero.

timeout 5 ping Nostromo.local
echo $?

timeout 5 ping Nostromo.local w oknie terminala przy użyciu Ctrl + C

Jeśli wykonanie programu zakończy się przed upływem limitu czasu, timeout może przekazać kod zakończenia z programu z powrotem do powłoki.

Aby tak się stało, program musi samoczynnie zatrzymać się (innymi słowy, nie jest zakończony przez przekroczenie limitu czasu) i musimy użyć opcji –preserve-status.

Jeśli użyjemy opcji -c (count) z wartością pięć, ping spowoduje uruchomienie tylko pięciu żądań. Jeśli podamy limit czasu wynoszący jedną minutę, ping z pewnością sam się zakończy. Następnie możemy sprawdzić wartość wyjścia za pomocą echo.

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

timeout --preserve-status 1m ping -c 5 Nostromo.local w oknie terminala

ping kończy pięć żądań ping i kończy. Kod zakończenia to zero.

Aby sprawdzić, czy kod zakończenia pochodzi z polecenia ping, wymuś ping, aby wygenerował inny kod zakończenia. Jeśli spróbujemy wysłać żądania ping na nieistniejący adres IP, polecenie ping zakończy się niepowodzeniem i zostanie wyświetlony kod zakończenia błędu. Następnie możemy użyć echo, aby sprawdzić, czy kod zakończenia jest różny od zera.

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

timeout --preserve-status 1m ping -c 5 NotHere.local w oknie terminala

Polecenie ping oczywiście nie może dotrzeć do nieistniejącego urządzenia, więc zgłasza błąd i zamyka się. Kod wyjścia to dwa. To jest kod zakończenia używany przez polecenie ping w przypadku błędów ogólnych.

Ustalanie podstawowych zasad

Timeout polega na wyznaczeniu pewnych granic dla uruchomionych programów. Jeśli istnieje niebezpieczeństwo, że pliki dziennika mogą przepełnić dysk twardy lub jeśli zapomnisz, że zostawiłeś uruchomione narzędzie sieciowe, zawiń je w czasie i pozwól komputerowi na samoregulację.