GNU/Linux >> Linux Esercitazione >  >> Linux

Processo Linux in background - Arresto nei lavori?

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:

  1. 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 & .
  2. Esci dal terminale dopo aver avviato il programma, che causerà l'associazione con il stdin del programma andare via. Ma questo causerà un SIGHUP 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 usando nohup - 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


Linux
  1. Parti per un'avventura nel tuo terminale Linux

  2. Come avviare il comando Linux in background e scollegare il processo nel terminale

  3. Come impedire l'arresto di un processo in background dopo la chiusura del client SSH in Linux

  4. Come ottenere l'ID processo del processo in background?

  5. Linux:chiudi un programma con la riga di comando (non uccidilo)

Come uccidere un processo o fermare un programma in Linux

Come compilare C, C++ e Java utilizzando Terminal su Linux

Come lavorare con il processo in primo piano e in background in Linux

Linux Bash Scripting Part5 – Segnali e lavori

Come inviare processi in background su Linux

Cos'è un processo interrotto in Linux?