Da quello che posso raccogliere.
Ai processi in background viene impedito di leggere il terminale dell'utente. Quando si tenta di farlo, verrà sospeso fino a quando l'utente non lo porta in primo piano e fornisce un input. "leggere dal terminale dell'utente" può significare tentare direttamente di leggere dal terminale o modificare le impostazioni del terminale.
Normalmente è quello che vuoi, ma a volte i programmi leggono dal terminale e/o modificano le impostazioni del terminale non perché hanno bisogno dell'input dell'utente per continuare, ma perché vogliono verificare se l'utente sta tentando di fornire input.
http://curiousthing.org/sigttin-sigttou-deep-dive-linux ha i cruenti dettagli tecnici.
In Linux e altri sistemi Unix, un lavoro che è in esecuzione in background, ma ha ancora il suo stdin
(o std::cin
) associato al suo terminale di controllo (ovvero la finestra in cui è stato eseguito) verrà inviato un SIGTTIN
segnale, che per impostazione predefinita provoca l'arresto completo del programma, in attesa che l'utente lo porti in primo piano (fg %job
o simili) per consentire l'effettivo input al programma. Per evitare che il programma venga messo in pausa in questo modo, puoi:
- Assicurati che i programmi
stdin
channel non è più associato al terminale, reindirizzandolo a un file con contenuti appropriati per l'inserimento da parte del programma o a/dev/null
se davvero non ha bisogno di input, ad es.myprogram < /dev/null &
. - Esci dal terminale dopo aver avviato il programma, che causerà l'associazione con il
stdin
del programma andare via. Ma questo causerà unSIGHUP
da consegnare al programma (il che significa che il canale di input/output ha subito un "riaggancio") - questo normalmente causa la chiusura di un programma, ma questo può essere evitato usandonohup
- per esempio.nohup myprogram &
.
Se sei interessato a catturare l'output del programma, questa è probabilmente l'opzione migliore, poiché impedisce entrambi i segnali di cui sopra (così come un paio di altri) e salva l'output affinché tu possa esaminarlo per determinare se ci sono problemi con l'esecuzione dei programmi:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
Sì, è davvero fermo e non funziona più in background. Per riportarlo in vita digita fg
numero_lavoro