In quali casi SIGHUP non viene inviato a un lavoro quando ti disconnetti?


10

Ho letto una risposta da un utente che ha affermato che in esecuzione

foo 2>&1 >& output.log &

si tradurrebbe nel foocontinuare a funzionare anche quando si disconnettono. Secondo questo utente, questo ha funzionato anche su connessioni SSH.

Non credevo davvero che, poiché avevo l'impressione che in caso di disconnessione da SSH o di chiusura del TTY, la shell e quindi i suoi processi avrebbero ricevuto un SIGHUP, causandone la chiusura. Questo, a mio avviso, era l'unico motivo per l'utilizzo nohupin questi casi, o tmux, screenet al.

Ho quindi esaminato il manuale di glibc :

Questo segnale viene anche utilizzato per segnalare la fine del processo di controllo su un terminale ai lavori associati a quella sessione; questa terminazione disconnette efficacemente tutti i processi nella sessione dal terminale di controllo.

Questo sembra confermare i miei pensieri. Ma guardando oltre, dice :

Se il processo è un leader di sessione che ha un terminale di controllo, un segnale SIGHUP viene inviato a ciascun processo nel lavoro in primo piano e il terminale di controllo viene dissociato da quella sessione.

Quindi, questo significa che i lavori messi in background non riceveranno SIGHUP?

Con mia ulteriore confusione, ho eseguito una sessione interattiva di Zsh, ho eseguito yes >& /dev/null &e digitato exit, quando Zsh mi ha avvertito che avevo dei lavori in corso e, dopo aver digitato exituna seconda volta, mi ha detto che aveva SIGHUPed un lavoro. Fare esattamente lo stesso in Bash lascia il lavoro in esecuzione ...


Ho avuto problemi con un server in passato che si disconnetteva improvvisamente su ssh e il mio processo continuava a funzionare ma senza alcun tty associato, quindi ho dovuto accedere di nuovo e inviare SIGHUP / TERM / KILL per terminarli. Quindi, seguendo la stessa logica, ho testato proprio ora, ho digitato logouted yesè ancora in esecuzione.
Braiam,

Oltre a inviare o meno SIGHUP, se un processo ha definito un gestore di segnale (e rileva SIGHUP) o una maschera di segnale sono ulteriori fattori per stabilire se viene terminato quando viene inviato quel segnale. Quindi, solo perché rimane in esecuzione dopo il logout non significa che non sia stato inviato quel segnale
Tim B

Ti stai riferendo a questa domanda: serverfault.com/questions/115999/… ? La risposta sembra trovarsi lì: è RedHat che non imposta shopt per impostazione predefinita. È la particolare stranezza della configurazione di RedHat.
Boris Burkov,

@Bob No, non l'ho mai visto prima, ma è una buona risorsa. Grazie!
slhck,

Sono contento che abbia aiutato. In realtà anche Raphael si riferisce a questo problema.
Boris Burkov,

Risposte:


18

Bash sembra inviare il SIGHUPsolo se si è auto ricevuto un SIGHUP, che ad esempio si verifica quando un terminale virtuale viene chiuso o quando la connessione SSH viene interrotta. Dalla documentazione :

La shell esce di default al ricevimento di un SIGHUP. Prima di uscire, una shell interattiva rinvia SIGHUP a tutti i lavori, in esecuzione o arrestati. I lavori interrotti vengono inviati a SIGCONT per garantire che ricevano il SIGHUP. Per impedire alla shell di inviare il segnale SIGHUP a un particolare lavoro, è necessario rimuoverlo dalla tabella dei lavori con la funzione incorporata disconoscimento (vedere Incorporati controllo lavoro) o contrassegnata per non ricevere SIGHUP usando disown -h.

Quindi, se si digita exito si preme Ctrl+, Dtutto il processo in background rimarrà, poiché questo non invia un segnale di riaggancio al Bash.

Puoi forzare Bash ad avvertirti del fatto che ci sono ancora processi in background in esecuzione

shopt -s checkjobs

C'è un'opzione per inviare l' SIGHUPuscita all'uscita se ci si trova in una shell interattiva ( vedere qui ). Ma non funziona sulla mia macchina con Bash 4.2.25. Forse funziona per te

shopt -s huponexit

Quindi, quando una connessione SSH si interrompe, SIGHUPviene inviata, altrimenti, con un'uscita pulita, i lavori continuano a funzionare? Questo spiega ciò che ho visto.
slhck,

Sì. Il segnale di riaggancio è presente solo nel caso speciale, quando la connessione con l'utente viene interrotta.
Raphael Ahrens,



@npostavs grazie per le informazioni che ho aggiunto alla risposta.
Raphael Ahrens,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.