Jak korzystać z polecenia nohup w systemie Linux

Opublikowany: 2022-06-25
Laptop z systemem Linux wyświetlający monit bash
fatmawati achmad zaenuri/Shutterstock.com

Komenda Linux nohup umożliwia kontynuowanie ważnych procesów, nawet gdy okno terminala, które je uruchomiło, jest zamknięte. Pokażemy Ci, jak używać tego czcigodnego polecenia w dzisiejszym Linuksie.

HUP i SIGHUP

Unix, przodek Linuksa, został stworzony przed wynalezieniem PC. Komputery były dużymi, drogimi urządzeniami. Ludzie kontaktowali się z nimi za pośrednictwem łączy szeregowych lokalnie w tym samym budynku lub zdalnie przez wolne połączenia modemowe. Początkowo pisali swoje instrukcje na teledrukarkach, które stopniowo zastępowano głupimi terminalami.

Nazywano ich głupimi, ponieważ moc obliczeniowa była w komputerze, do którego byłeś podłączony, a nie w terminalu, na którym pisałeś. Programy działały na komputerze — gdziekolwiek mógł się znajdować — a nie na urządzeniu na twoim biurku.

Jeśli zdarzyło się coś, co zerwało połączenie między terminalem a komputerem, komputer wykrył spadek linii i wysłał sygnał HUP lub rozłączenia do programów, które były uruchomione. Programy przestały działać po otrzymaniu sygnału.

Jak zabić aplikację komputerową lub proces w tle w systemie Linux?
POWIĄZANE Jak zabić aplikację komputerową lub proces w tle w systemie Linux

Ta funkcjonalność jest nadal obecna w Linuksie. Na twoim komputerze okno terminala jest emulacją terminala fizycznego. Jeśli masz uruchomione procesy, które zostały uruchomione z tego okna terminala i zamkniesz to okno, sygnał SIGHUP jest wysyłany do programów, aby zostały poinformowane o HUP i wiedziały, że powinny się zakończyć.

Następuje efekt kaskadowy. Jeśli procesy uruchomiły jakiekolwiek procesy potomne, SIGHUP jest również przekazywany do nich, aby wiedziały, że powinny zakończyć.

Komenda nohup uruchamia procesy potomne, ale odmawia przekazania im sygnałów SIGHUP . Może to brzmieć jak problem, ale w rzeczywistości jest to przydatna funkcja.

Dowództwo nohup

Jeśli chcesz, aby proces był kontynuowany, nawet jeśli okno terminala, z którego został uruchomiony, jest zamknięte, potrzebujesz sposobu na przechwycenie SIGHUP , aby program nigdy go nie otrzymał. (W rzeczywistości okno terminala nie uruchamia procesów, są one uruchamiane przez sesję powłoki wewnątrz okna terminala.) Prostym i eleganckim rozwiązaniem tego problemu jest umieszczenie innego procesu między sesją powłoki a programem i posiadanie tego program warstwy pośredniej nigdy nie przekazuje sygnału SIGHUP .

To właśnie robi nohup . Uruchamia programy, aby były procesem potomnym nohup , a nie procesem potomnym powłoki. Ponieważ nie są procesem potomnym powłoki, nie otrzymają bezpośrednio SIGHUP z powłoki. A jeśli nohup nie przekaże SIGHUP swoim dzieciom, program w ogóle nie otrzyma SIGHUP .

Jest to przydatne, gdy na przykład masz długotrwały proces, który musisz dokończyć. Jeśli przypadkowo zamkniesz okno terminala i jego powłokę, również zakończysz proces. Użycie nohup do uruchomienia procesu izoluje proces od sygnału nohup . Jeśli pracujesz zdalnie na komputerze przez SSH i nie chcesz, aby wrażliwy proces zakończył się, jeśli połączenie zdalne nie powiedzie się, możesz rozpocząć proces na komputerze zdalnym za pomocą nohup .

Korzystanie z nohup

Stworzyliśmy program, który nie robi nic użytecznego, ale będzie działał i działał aż do zakończenia. Wypisuje czas w oknie terminala co trzy sekundy. Nazywa się to long-proc procesem od „długiego procesu”.

 ./długi-proc 

Długi program działający w oknie terminala

Jeśli był to program, który zrobił coś pożytecznego i chcielibyśmy, aby działał, nawet jeśli okno terminala i powłoka są zamknięte, uruchomilibyśmy go za pomocą nohup .

 nohup ./long-proc 

uruchomienie programu long-proc od nohup

Proces jest oddzielony od stdin i stdout , więc nie może odbierać żadnych danych wejściowych ani pisać do okna terminala. Ponadto, ponieważ nadal działa, nie wracasz do wiersza polecenia. Jedyne, co robi nohup , to uchronienie procesu przed zamknięciem terminala. Nie zamienia procesu w zadanie w tle.

Czy teraz musisz ponownie uruchomić komputer, aby zakończyć proces? Nie. Aby zatrzymać proces nohup , którego nie uruchomiłeś jako proces w tle, naciśnij kombinację klawiszy Ctrl+C.

Zatrzymanie długiego procesu za pomocą Ctrl+C

Dane wyjściowe programu zostały dla nas przechwycone w pliku o nazwie „nohup.out”. Możemy to przejrzeć za mniej.

 mniej nohup.out 

Otwarcie pliku nohup.out w mniej

Wszystko, co zwykle zostanie wysłane do okna terminala, zostanie przechwycone w pliku. Kolejne uruchomienia nohup będą dołączane do istniejącego pliku „nohup.out”.

Wyjście z long-proc zapisane w pliku nohup.out, wyświetlane w less

Bardziej użytecznym sposobem na uruchomienie procesu jest uruchomienie go z nohup , aby wytrzymał zamknięcie okna terminala, a jednocześnie uczynienie go zadaniem w tle. Aby to zrobić, dodajemy znak ampersand „ & ” na końcu wiersza poleceń.

 nohup ./long-proc & 

uruchomienie programu long-proc z nohup i uczynienie go zadaniem w tle

Aby powrócić do wiersza poleceń, musisz jeszcze raz nacisnąć „Enter”. Powiedziano nam, że numer zadania procesu to 1 — numer w nawiasie „ [] ” — a identyfikator procesu to 13115.

Możemy użyć jednego z nich do zakończenia procesu. „Ctrl+C” nie będzie teraz działać, ponieważ program nie jest powiązany ani z oknem terminala, ani z powłoką.

Jeśli zapomnisz, jaki jest numer zadania, możesz użyć polecenia jobs , aby wyświetlić listę zadań w tle, które zostały uruchomione z tego okna terminala.

 Oferty pracy 

Wyświetlanie listy zadań w tle, które zostały uruchomione z okna terminala

Aby zabić nasze zadanie, możemy użyć polecenia kill i numeru zadania poprzedzonego znakiem procentu „ % ”, w ten sposób:

 zabij % 1

Jeśli zamknąłeś okno terminala, musisz znaleźć identyfikator procesu i użyć go z poleceniem kill . Polecenie pgrep znajdzie identyfikator procesu dla procesów, które pasują do podanej wskazówki wyszukiwania. Poszukamy nazwy procesu.

 pgrep long-proc 

Znajdowanie identyfikatora procesu według nazwy

Teraz możemy użyć identyfikatora procesu do zakończenia procesu.

 zabić 13115 

Używanie polecenia kill i identyfikatora procesu do zakończenia procesu

Następnym razem, gdy naciśniesz „Enter”, zostaniesz poinformowany, że proces został zakończony.

Przyjrzyjmy się teraz, co nie kończy procesu. Uruchomimy go ponownie, a następnie zamkniemy okno terminala.

 nohup ./long-proc 

Zamykanie okna terminala z uruchomionym procesem

Jeśli otworzymy nowe okno terminala i wyszukamy nasz proces za pomocą pgrep , zobaczymy, że nadal działa. Zamknięcie okna terminala, które uruchomiło proces, nie przyniosło efektu.

 pgrep long-proc 

Używanie pgrep do wyszukiwania procesu według nazwy

Możliwe jest przekazanie wielu poleceń do nohup , ale zwykle lepiej jest uruchamiać je osobno. Ułatwia manipulowanie nimi jako zadaniami w tle. Polecenia nie będą uruchamiane w tym samym czasie, będą wykonywane jedno po drugim. Wykonanie nie jest równoczesne, jest sekwencyjne. Aby działały równolegle, musisz je uruchomić osobno.

Powiedziawszy to, aby uruchomić kilka procesów naraz, użyj nohup do uruchomienia powłoki Bash i użyj opcji -c (polecenia) z ciągiem poleceń. Użyj pojedynczych cudzysłowów „ ' ”, aby zawinąć listę poleceń i podwójnych znaków ampersand „ && ”, aby oddzielić polecenia.

 nohup bash -c 'ls /bin && ls /sbin' 

Uruchomienie dwóch procesów z nohup

Jeśli użyjesz less do przejrzenia pliku „nohup.out”, zobaczysz dane wyjściowe z pierwszego procesu, a następnie dane wyjściowe z drugiego procesu.

 mniej nohup.out 

Otwarcie pliku nohup.out w mniej

Dane wyjściowe obu poleceń zostały przechwycone w pliku „nohup.out”. Nie jest przeplatany, wyjście z drugiego procesu rozpoczyna się dopiero po zakończeniu pierwszego procesu.

Zawartość pliku nohup.out w mniej

Jeśli chcesz użyć własnego pliku zamiast „nohup.out”, możesz przekierować polecenie do wybranego pliku.

 nohup bash -c 'ls /bin && ls /sbin' > mójplik.txt 

przekierowanie wyjścia z procesów do pliku dostarczonego przez użytkownika

Zauważ, że komunikat nie mówi już „dołączanie danych wyjściowych do nohupo.out”, mówi „przekierowanie stderr na stdout” i przekierowujemy stdout do naszego pliku „myfile.txt”.

Możemy zajrzeć do pliku „myfile.txt” z mniejszą ilością.

 mniej mójplik.txt 

Jak poprzednio, zawiera dane wyjściowe obu poleceń.


To zabawne, jak historia narzędzia może czasami sprawiać wrażenie, jakby nie miała związku z współczesnością. Jednym z nich jest polecenie nohup . Coś, co zostało stworzone, aby radzić sobie z rozłączeniami na liniach szeregowych, nadal jest przydatne dla dzisiejszych użytkowników Linuksa na niewiarygodnie potężnych maszynach.

POWIĄZANE: 37 ważnych poleceń systemu Linux, które powinieneś znać