Esecuzione di programmi in background dal terminale

Come posso eseguire un programma sullo sfondo di una shell, con la possibilità di chiudere la shell lasciando il programma in esecuzione? Diciamo che la mia interfaccia utente sta avendo problemi o per qualche ragione, ho bisogno di avviare un programma dalla finestra del terminale, ad esempio, nm-applet :

 nm-applet 

Quando viene avviato, occupa il primo piano della finestra del terminale.

C’è un modo semplice per eseguire il programma in background senza dover lasciare il terminale aperto o occupare l’intero terminale?

In quella nota, ho trovato un modo per eseguire programmi dal terminale e consentire altri input, aggiungendo una e commerciale ( & ) al comando in quanto tale:

 nm-applet & 

Ma questo non è molto utile dato che tutti i processi avviati nel terminale vengono uccisi una volta chiuso il terminale.

Sono tornato da poco a setsid . Inizia come se steste facendo qualcosa dal terminale ma puoi disconnetterti (chiudi il terminale) e continua a funzionare.

Questo perché il comando effettivamente esce e mentre l’input arriva al terminale corrente, è di proprietà di un genitore completamente diverso (che rimane vivo dopo la chiusura del terminale).

Un esempio:

 setsid gnome-calculator 

Sono anche abbastanza parziale da disown che può essere utilizzato per separare un processo dall’albero corrente. Lo usi in concomitanza con la e commerciale in background:

 gnome-calculator & disown 

Ho anche appena saputo di generare sottotitoli con parentesi. Questo semplice metodo funziona:

 (gnome-calculator &) 

E ovviamente non c’è nohup come hai detto. Non sono nohup di nohup perché ha la tendenza a scrivere in ~/nohup.out senza che me lo chieda. Se ti affidi a quello, potrebbe essere per te.

 nohup gnome-calculator 

E per i processi a lungo termine, ci sono cose come lo screen e altri virtual-muxer del terminale che mantengono vive le sessioni tra le connessioni. Questi probabilmente non si applicano a te perché vuoi solo un accesso temporaneo all’output del terminale, ma se volessi tornare indietro qualche tempo dopo e visualizzare l’ultima attività del terminale, lo schermo sarebbe probabilmente la scelta migliore.

Internet è pieno di tutorial su screen ma ecco un semplice avvio rapido:

Ecco i due modi con cui andrei. Innanzitutto, non eseguirlo da un terminale; premi Alt + F2 per aprire la finestra di dialogo Esegui ed eseguila da lì (senza &).

Da un terminale, corri

 nm-applet & 

Ma NON chiudere il terminale da soli. Cioè, non premere il tasto X per chiudere, e non usare File -> Esci dalla sua barra dei menu. Se chiudi il terminale in questo modo, invierà un segnale HUP (Hang UP) alla bash in esecuzione all’interno, che a sua volta invierà il segnale HUP a tutti i suoi figli (motivo per cui nohup funziona in questo caso).

Invece, esci dalla shell eseguendo exit o premendo Ctrl + D. bash quindi rinnegherà i suoi figli, quindi uscirà, lasciando i processi in background ancora in esecuzione. E quando bash esce, il terminale ha perso il processo figlio, quindi chiuderà anche lui.

Fare tutto in una volta:

 nm-applet & exit 

Come hai sottolineato, puoi correre

 nohup nm-applet & 

ignorare il segnale di fine quando si chiude il terminale. Nessun problema.

Una cosa che mancano molte altre risposte è come staccare un processo in esecuzione che attualmente blocca la shell. Nella maggior parte dei terminali e delle shell, Ctrl + Z interromperà il processo in esecuzione e ti riporterà a un prompt di input. Quindi, puoi emettere

 bg 

per inviare il processo in esecuzione in background. Problema

 fg 

invece di riportare il processo in esecuzione in primo piano.

EDIT : più dettagli in questa risposta ho scoperto più tardi.

Usa (exec PROGRAM &> /dev/null & ) per consentire al PID di subshell di essere preso in carico da PROGRAM . Ho testato questo approccio più volte con diversi programmi diversi. La chiusura del terminale originale non ha alcun effetto sul programma appena generato

Piccola demo:

 $ # this is before running $ (exec firefox &> /dev/null &) $ # and look, we still in side the terminal and can continue working 

Posso consigliare il terminale byobu. È ansible staccare facilmente il processo premendo il tasto F6.

Anche se ci sono buone risposte sopra, vorrei dare i miei 2 centesimi su come utilizzo MATLAB in background.

 sudo -b matlab 

Il tag -b di sudo può eseguire applicazioni in background. È anche ansible chiudere il terminale dopo aver eseguito questo comando.

Probabilmente, non correlato, ma esiste un sito Web meraviglioso che è ansible utilizzare per spiegare i comandi della shell. http://explainshell.com/explain/8/sudo

Non lo conosco nel modo giusto, ma ho appena iniziato un’altra sessione lasciando il precedente a tutti. Ad esempio ho eseguito un semplice server web sul mio lampone. quello web.py. quindi inizio una nuova sessione lasciandola da sola. questo è tutto. è anche utile perché si è ancora aggiornati anche se si sta lavorando sull’altra sessione.