Polecenie nohup: użycie, nohup.out i działanie po zamknięciu terminala

Środowisko testoweRodzina RHELAlmaLinux 9.8coreutils 8.32konto rootDebian 12 · coreutils 9.1 zwykłe kontoSprawdzono 2026-11-05
Polecenia procesów · harmonogramunohupLokalizacja/usr/bin/nohup
Działa dalej także po zamknięciu terminala

Aby zadanie działało dalej po zamknięciu terminala albo zerwaniu połączenia SSH, uruchom je poleceniem nohup. nohup uruchamia polecenie tak, by ignorowało sygnał rozłączenia (SIGHUP), który przychodzi przy zamykaniu terminala. Gdy na serwerze AlmaLinux 9 uruchomiono razem sleep z nohup i sleep bez nohup, a potem zamknięto terminal, dalej działał tylko ten uruchomiony z nohup.

Poniższe wyniki pochodzą z serwera AlmaLinux 9.8 (konto root) i serwera Debian 12 (zwykłe konto). Zamiast długiego zadania uruchomiono sleep, a przy kończeniu podano tylko PID otrzymany przy starcie. Czas jest podany w UTC.

1️⃣ Jak używać polecenia nohup

  • ↪️ Znak & na końcu i co się dzieje po zamknięciu terminala

nohup stawia się przed poleceniem do uruchomienia, a znak & na końcu polecenia włącza uruchamianie w tle. Według oficjalnego podręcznika GNU samo nohup nie przenosi polecenia w tło, więc bez & znak zachęty wraca dopiero po zakończeniu polecenia.

nohup sleep 300 &
[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'

[1] to numer zadania, a 3431609 to PID uruchomionego procesu. Następny komunikat mówi, że wejście z klawiatury nie będzie czytane, a wyjście będzie dopisywane do pliku nohup.out.

PID właśnie uruchomionego zadania zostaje w $!. Sprawdź go poleceniem [echo $!] zaraz po starcie i zapisz – tego samego numeru użyjesz, gdy zechcesz sprawdzić stan zadania albo je zakończyć.

echo $!
3431609

Po zamknięciu terminala powłoka dostaje sygnał rozłączenia i wysyła ten sam sygnał do zadań, które uruchomiła (według oficjalnego podręcznika Bash). Aby to sprawdzić, w nowym terminalu uruchomiono razem [nohup sleep 300 &] oraz, bez nohup, [sleep 301 &].

sleep 301 &
[2] 3432892
jobs -l
[1]- 3432883 Running                 nohup sleep 300 &
[2]+ 3432892 Running                 sleep 301 &

Gdy oba zadania były w stanie Running, okno terminala zamknięto, a oba PID sprawdzono poleceniem ps z innej powłoki.

ps -p 3432883,3432892 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3432883 S          00:05 sleep 300

Został tylko sleep 300 uruchomiony z nohup; sleep 301 uruchomiony bez nohup zakończył się razem z zamknięciem terminala.

Proces uruchomiony z nohup jest jak telefon z włączonym trybem Nie przeszkadzać.

nohup to polecenie z pakietu coreutils. Zainstalowaną wersję widać w pierwszym wierszu --version. Serwer AlmaLinux 9.8 miał 8.32, a serwer Debian 12 – 9.1.

nohup --version | head -1
nohup (GNU coreutils) 8.32
nohup --version | head -1
nohup (GNU coreutils) 9.1

2️⃣ nohup.out i przekierowanie wyjścia

  • ↪️ Własny plik dziennika i /dev/null

Jeśli nie wskażesz, dokąd ma trafić wyjście, nohup dopisuje wyjście polecenia do nohup.out w bieżącym folderze. Nowo utworzony nohup.out miał 0 bajtów i uprawnienia -rw-------, czyli odczyt i zapis tylko dla użytkownika, który go utworzył.

ls -l nohup.out
-rw------- 1 root root 0 Oct 28 23:04 nohup.out

Oficjalny podręcznik GNU wyjaśnia, że nohup tworzy nohup.out tak, by czytać i zapisywać go mógł tylko użytkownik, który go utworzył, niezależnie od ustawienia umask. Jeśli nie da się pisać w bieżącym folderze, zapisuje do $HOME/nohup.out w folderze domowym, a jeśli tam też się nie da, nie uruchamia polecenia.

Gdy polecenie, które coś wypisuje, uruchomiono przez nohup, po jego zakończeniu wyjście zostało w nohup.out.

nohup sh -c 'echo start; sleep 2; echo end' &
[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'
cat nohup.out
start
end
[1]+  Done                    nohup sh -c 'echo start; sleep 2; echo end'

Done w ostatnim wierszu to komunikat powłoki, że zadanie się skończyło. nohup.out nie jest tworzony od nowa przy każdym uruchomieniu, tylko dopisywany na końcu tego samego pliku, więc jeśli uruchomisz kilka zadań z tego samego folderu, ich wyjście wymiesza się w jednym pliku.

Aby każde zadanie miało osobny dziennik, wskaż plik wyjścia przez > i skieruj też wyjście błędów do tego samego pliku przez 2>&1.

nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &
[1] 3432059
cat job.log
nohup: ignoring input
start

Po dodaniu 2>&1 terminal pokazał tylko numer zadania i PID, a komunikat nohup [nohup: ignoring input] trafił do pierwszego wiersza pliku dziennika.

Jeśli dodasz tylko > bez 2>&1, w terminalu pojawi się komunikat, że wyjście błędów jest przekierowywane do pliku wyjścia standardowego.

nohup sleep 300 > job2.log &
[2] 3432097
nohup: ignoring input and redirecting stderr to stdout

Wyjście zadań, którego nie trzeba zachowywać, kieruje się do /dev/null. Także wtedy terminal pokazał tylko numer zadania i PID.

nohup sleep 300 > /dev/null 2>&1 &
[3] 3432137

W tabeli poniżej widać, dokąd trafiło wyjście i jaki komunikat pojawił się w terminalu dla każdego z czterech sposobów uruchomienia.

Sposób uruchomieniaDokąd trafia wyjścieKomunikat w terminalu
nohup polecenie &nohup.out w bieżącym folderzenohup: ignoring input and appending output to 'nohup.out'
nohup polecenie > plik &Wskazany plik (razem z wyjściem błędów)nohup: ignoring input and redirecting stderr to stdout
nohup polecenie > plik 2>&1 &Wskazany plikBrak (komunikat w pierwszym wierszu pliku)
nohup polecenie > /dev/null 2>&1 &OdrzucaneBrak

3️⃣ Sprawdzanie i kończenie procesów nohup

  • ↪️ jobs, ps, kill

Lista jobs pokazuje tylko zadania uruchomione z bieżącej powłoki, dlatego po zamknięciu terminala i ponownym połączeniu proces nohup sprawdza się poleceniem ps -p z podanym PID. Dopóki jesteś w tej samej powłoce, jobs -l pokazuje razem numer zadania, PID i stan.

jobs -l
[1]+ 3431609 Running                 nohup sleep 300 &

Jeśli po ps -p podasz PID i wybierzesz kolumny przez -o, pojawi się tylko wiersz tego procesu. S w STAT oznacza, że proces śpi w oczekiwaniu na zdarzenie, a ELAPSED to czas od jego startu.

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3431609 S          00:03 sleep 300

Aby je zakończyć, użyj kill z numerem PID.

kill 3431609

kill nic nie wypisał, a po uruchomieniu jobs zadanie pojawiło się jako Terminated i zniknęło z listy.

jobs
[1]+  Terminated              nohup sleep 300

Ponowne ps z tym samym PID pokazało tylko nagłówek, co potwierdziło, że proces się zakończył.

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD

nohup ignoruje tylko sygnał rozłączenia, więc wysłanie tego samego sygnału wprost przez [kill -HUP] nie kończy procesu. kill -HUP wysłano do sleep 305 uruchomionego z nohup i do sleep 306 uruchomionego bez nohup.

kill -HUP 3437119 3437128

Następne sprawdzenie przez jobs -l pokazało jako Running tylko zadanie z nohup, a sleep 306 zakończył się z Hangup.

jobs -l
[1]- 3437119 Running                 nohup sleep 305 &
[2]+ 3437128 Hangup                  sleep 306

Jeśli nie podasz kill sygnału, wysyła SIGTERM, więc zadanie uruchomione z nohup także kończy się przez [kill PID].

4️⃣ Polecenie nohup a disown, opcje

  • ↪️ disown -h, kiedy wybrać tmux, i opcje w skrócie

🔲 nohup a disown

disown to wbudowane polecenie bash do zadań, które już działają: pozwala później odłączyć od sygnału rozłączenia terminala zadanie uruchomione przez & bez nohup. disown nie przekierowuje wyjścia do nohup.out, więc w zadaniach, które coś wypisują, wskaż przy starcie przez > plik, dokąd ma trafiać wyjście.

Według oficjalnego podręcznika Bash disown bez opcji usuwa zadanie z listy jobs, a disown -h zostawia je na liście i tylko blokuje docieranie do niego sygnału rozłączenia. Najpierw uruchomiono sleep 302, a potem wykonano disown.

sleep 302 &
[1] 3433230
disown

disown nic nie wypisał, a uruchomione zaraz potem jobs -l też dało pusty wynik.

jobs -l

Następnie uruchomiono sleep 303 i wykonano disown -h dla zadania o numerze %1.

sleep 303 &
[1] 3433343
disown -h %1

Sprawdzenie przez jobs -l pokazało, że zadanie nadal jest na liście.

jobs -l
[1]+ 3433343 Running                 sleep 303 &

Do tego uruchomiono jeszcze sleep 304 bez żadnej obsługi, zamknięto terminal i z innej powłoki sprawdzono trzy PID.

sleep 304 &
[2] 3433474
ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3433230 S          00:11 sleep 302
3433343 S          00:08 sleep 303

Dwa zadania z disown i disown -h zostały, a zakończył się tylko sleep 304 bez obsługi. Porównanie czterech metod:

MetodaKiedyLista jobsPo zamknięciu terminalaWynik
nohup polecenie &Przy starcieZostajeZostajenohup.out lub wskazany plik
polecenie & potem disownPo starciePominięteZostajeBez zmian
polecenie & potem disown -hPo starcieZostajeZostajeBez zmian
Samo polecenie &—ZostajeZakończoneBez zmian

Do pracy, w której trzeba przywołać ekran sesji i pisać dalej, pasuje multiplekser terminala, taki jak tmux; do pracy, którą uruchamia się raz i odbiera tylko wynik w pliku, wystarczy nohup.

🔲 Opcje polecenia nohup

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
--versionWypisuje informacje o wersji i kończy działanieSerwer AlmaLinux 9.8: nohup (GNU coreutils) 8.32, serwer Debian 12: nohup (GNU coreutils) 9.1

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
--helpWypisuje pomoc i kończy działanie

🔲 Symulator polecenia nohup

W symulatorze poniżej możesz uruchomić zadanie przez nohup, zamknąć terminal przyciskiem 🔌, połączyć się ponownie i samodzielnie sprawdzić, które procesy zostają.

Symulator polecenia nohupcoreutils 8.32
[root@server work]#
Działa tylko w przeglądarce i nie uruchamia prawdziwych procesów. Czas sleep płynie według prawdziwego zegara, a ↑↓ przywołują wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Według oficjalnego podręcznika GNU nohup kończy się kodem 125, gdy zawiedzie samo nohup, 126, gdy polecenie znaleziono, ale nie dało się go uruchomić, oraz 127, gdy polecenia nie znaleziono. Na serwerze AlmaLinux 9 samo nohup bez polecenia dało 125, ./job.sh bez prawa wykonania 126, a nieistniejące polecenie nosuchcmd 127.

nohup nie zmienia wartości nice, więc używa się z nim nice, na przykład [nohup nice -n 10 sleep 307 &]. Tak uruchomiony sleep sprawdzony przez ps miał w kolumnie NI 10, a w STAT SN – z literą N oznaczającą niski priorytet.

Polecenie nohup ma tylko dwie opcje: [--help] i [--version]. Według oficjalnego podręcznika GNU opcje podaje się przed poleceniem do uruchomienia.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 9   +   2   =