2012-08-04 20 views
5

Quando avvio un processo in background in un terminale e un po 'come se il terminale viene chiuso, non possiamo più interagire con quel processo. Non sono sicuro, ma penso che anche il processo venga ucciso. Qualcuno può dirmi come posso staccare quel processo dal mio terminale. Quindi, anche se chiudo il terminale, posso interagire con lo stesso processo nel nuovo terminale?Come staccare un processo dal terminale in Unix?

Sono nuovo di unix così le tue informazioni extra mi aiuteranno.

+2

Perché non ci provi prima? Avvia un processo in background, scollegati e riaccedi e controlla con 'ps' se il processo è ancora in circolazione' – patrix

+0

Questo mi sembra una domanda interessante e utile, che segue. Sospetto che i processi avviati tramite il terminale saranno uccisi quando il terminale verrà ucciso. Onestamente, questo suona come una forchetta per me, non so però, non ho mai avuto bisogno di invocare una forchetta. – Dale

+0

Il processo viene interrotto se si disconnette o si perde la sessione, a meno che non si usi il comando [nohup] (http://en.wikipedia.org/wiki/Nohup) :) ma non si è sicuri se è possibile riprendere il processo una nuova sessione –

risposta

5

si potrebbe anche prendere in considerazione il comando screen. Ha la funzionalità "ripristina la mia sessione". Devo ammettere che non l'ho mai usato e me ne sono dimenticato.

Avviare il processo come daemon o con nohup potrebbe non eseguire tutto ciò che si desidera in termini di ri-acquisizione di stdout/stdin.

C'è un sacco di esempi sul web. Su Google provare, "comando screen unix" e "schermo esercitazione unix":

3

risultato primo su Google per "UNIX demonizzare un processo":

Vedere il demone (3) manpage per una breve panoramica. La cosa principale di demonizzare sta andando in background senza chiudere o trattenere nulla. Un elenco di cose un processo può fare per raggiungere questo:

  • fork()
  • setsid()
  • vicino/reindirizzamento stdin/output/error a/dev/null e/o ignorare SIGHUP/SIGPIPE.
  • chdir() a /.

Se avviato come processo di root, si desidera anche eseguire prima le operazioni che devono essere root e quindi rilasciare i privilegi. Cioè, cambia utente effettivo in "demone" utente o "nessuno" con setuid()/setgid(). Se non è possibile eliminare tutti i privilegi e richiedere l'accesso root , utilizzare seteuid() per rilasciarlo temporaneamente quando non è necessario.

Se stai sborsare un demone poi anche i gestori di configurazione dei bambini e, se chiamate exec, impostare la stretta sulle bandiere exec su tutti i descrittori di file i vostri figli non avranno bisogno.

Ed ecco un HOWTO sulla creazione di demoni Unix: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

+1

Più o meno quello che ho capito. Se/quando ho bisogno di scrivere un demone, sono sicuro che dovrò google/stackoverflow tutte queste sciocchezze me stesso. – Dale

13

Il comando che stai cercando è rinnegare.

disown <processid> 

Questo è il più vicino possibile a un nohup. Stacca il processo dal login corrente e gli consente di continuare a funzionare. Grazie David Korn!

http://www2.research.att.com/~gsf/man/man1/disown.html

e ho appena trovato reptyr che consente di Reparent un processo rinnegato. https://github.com/nelhage/reptyr

È già nei pacchetti per ubuntu.

MA se non si è ancora avviato il processo e si prevede di farlo in futuro, la strada da percorrere è screen e tmux. Preferisco screen.

0

'Interagire con' può significare un paio di cose.

Il motivo per cui un programma, avviato alla riga di comando, termina quando termina il terminale, è perché la shell, quando esce, invia a quel processo un segnale HUP il modo, è l'abbreviazione di "riagganciare" e in origine indicava che l'utente aveva riattaccato il modem/il telefono). La risposta predefinita a un segnale HUP è che un processo è terminato, cioè il programma invocato viene chiuso.

I dettagli sono leggermente più laboriosi, ma questa è l'intuizione generale.

Il comando nohup indica alla shell di avviare il programma e di farlo in modo che questo segnale HUP sia ignorato. Cioè, il programma continua dopo le uscite del terminale di invocazione.

È ancora possibile interagire con questo programma inviandolo segnali (vedere di nuovo kill(1)), ma si tratta di un tipo molto limitato di interazione e dipende dal programma che si sta scrivendo per fare cose sensate quando riceve quei segnali (segnali USR1 e USR2 sono cose utili da intrappolare, se ti piace questo genere di cose). In alternativa, è possibile interagire tramite pipe denominate, o semafori o altri bit di comunicazione tra processi (IPC). Ciò diventa abbastanza veloce.

Sospetto che quello che state cercando, tuttavia, sia in grado di ricollegare un terminale al processo. È un processo piuttosto complicato e applicazioni come screen fanno cose dietro le quinte opportunamente complicate per farlo accadere.

La cosa nohup è una sorta di demonizzazione rapida e sporca. La funzione daemon(3) esegue correttamente la daemonizzazione, eseguendo vari bit di riordino come descritto nella risposta di YePhIcK, per interrompere in modo completo il collegamento con il processo/terminale che lo ha invocato. Puoi interagire con quel processo demonizzato con gli stessi strumenti IPC come sopra, ma non direttamente con un terminale.

Problemi correlati