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.
Spis treści:
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
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
Po 15 sekundach limit czasu kończy sesję ping i wracamy do wiersza poleceń.
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
ping będzie działał przez trzy minuty, po czym upłynie limit czasu i zatrzyma sesję ping.
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
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
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
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
dmesg działa przez 30 sekund i zatrzymuje się, gdy odbierze sygnał SIGTERM.
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
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 $?
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 $?
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 $?
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 $?
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ę.