Jak korzystać z polecenia nohup w systemie Linux
Opublikowany: 2022-06-25 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.
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
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
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.
Dane wyjściowe programu zostały dla nas przechwycone w pliku o nazwie „nohup.out”. Możemy to przejrzeć za mniej.
mniej nohup.out
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”.
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 &
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
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
Teraz możemy użyć identyfikatora procesu do zakończenia procesu.
zabić 13115
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
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
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'
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
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.
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
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ć