nohup în Linux / Bash

Procese și monitorizare POSIX / GNU coreutils

Pornește o comandă care continuă să ruleze și după ce închizi terminalul sau sesiunea SSH.

Sintaxă comandă
nohup comandă [argumente] [> fișier 2>&1] &

Ce face nohup

Când închizi terminalul sau se întrerupe conexiunea SSH, shell-ul trimite semnalul SIGHUP (hang up) proceselor pornite din el, iar acestea se opresc. Comanda nohup (no hang up) pornește programul astfel încât să ignore acest semnal.

Dacă ieșirea standard este terminalul, nohup o redirecționează automat în fișierul nohup.out din directorul curent (sau din $HOME, dacă directorul curent nu poate fi scris). În practică se combină aproape mereu cu &, ca procesul să ruleze în fundal, și cu o redirecționare explicită către un fișier de jurnal.

Pentru servicii permanente, varianta potrivită este o unitate systemd; nohup este bun pentru sarcini ocazionale, de exemplu un import lung de date pornit prin SSH.

Opțiuni și argumente

Opțiune / Parametru Descriere
comandă Programul care trebuie să ignore SIGHUP, urmat de argumentele lui.
& Operatorul shell-ului care pornește comanda în fundal, ca terminalul să rămână liber.
> fișier 2>&1 Trimite ieșirea și erorile într-un fișier ales de tine în loc de nohup.out.
--help, --version Singurele opțiuni proprii ale lui nohup (versiunea GNU).

Exemple

Exemplul 1: Un import lung care supraviețuiește deconectării

Ieșirea merge în import.log. Poți închide sesiunea SSH, iar scriptul continuă. Shell-ul afișează numărul jobului și PID-ul.

nohup ./import_clienti.sh > import.log 2>&1 &

Ieșire în terminal

[1] 48213

Exemplul 2: Ieșirea ajunge în fișierul de jurnal

Pornim în fundal un mic „backup” cu nohup, așteptăm cu wait să se termine și citim jurnalul.

nohup bash -c 'echo "Backup pornit pentru Iași"; echo "Backup terminat"' > backup.log 2>&1 &
wait
cat backup.log

Rezultat

Backup pornit pentru Iași
Backup terminat

Exemplul 3: Fără redirecționare: fișierul nohup.out

Rulată direct din terminal, comanda anunță unde scrie ieșirea.

nohup python3 genereaza_raport.py &

Ieșire în terminal

[1] 48377
nohup: ignoring input and appending output to 'nohup.out'

Greșeli frecvente

  • Uitarea lui &: nohup comandă fără & rulează în prim-plan și blochează terminalul până se termină.
  • Lăsarea nohup.out să crească la nesfârșit; redirecționează ieșirea într-un fișier de jurnal pe care îl rotești sau îl ștergi.
  • Folosirea nohup pentru un serviciu care trebuie să repornească după restart: pentru asta scrie o unitate systemd.

Comenzi înrudite

  • jobs, bg și fg: Gestionează joburile shell-ului: comenzi pornite în fundal, suspendate cu Ctrl+Z și aduse înapoi în prim-plan.
  • systemctl: Controlează sistemul de inițializare systemd și administrează serviciile (demoni de fundal).
  • kill: Trimite un semnal de control sau oprire către un proces specificat prin ID (PID).