Esecuzione di programmi in background dal terminale

121

Come faccio a far girare 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, diciamo, nm-applet :

nm-applet

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

Esiste un modo semplice per eseguire il programma in background senza dover lasciare aperto il terminale o occupare l'intero terminale?

In quella nota, ho trovato un modo per eseguire programmi dal terminale e consentire l'accesso ad 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.

    
posta OVERTONE 22.02.2012 - 01:07
fonte

8 risposte

155

Recentemente mi è piaciuto setsid . Inizia sembrare 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 attivo dopo la chiusura del terminale).

Un esempio:

setsid gnome-calculator

Sono anche piuttosto parziale a disown che può essere usato per separare un processo dall'albero corrente. Lo usi in combinazione con la e commerciale in background:

gnome-calculator & disown

Ho anche appena saputo della generazione di subshell con parentesi. Questo semplice metodo funziona:

(gnome-calculator &)

E ovviamente c'è nohup come hai detto. Non sono pazzo di nohup perché ha la tendenza a scrivere su ~/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 screen e altri virtual-muxer del terminale che mantengono vive le sessioni tra le connessioni. Probabilmente questi 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 il tuo migliore scelta.

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

risposta data Oli 22.02.2012 - 01:41
fonte
46

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 & amp;).

Da un terminale, esegui

nm-applet &

Ma NON chiudere il terminale da soli. Cioè, non premere il tasto X per chiudere, e non usare File - & gt; 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 (che è il 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 suo processo figlio, quindi chiuderà anche.

Fai tutto in una volta:

nm-applet & exit
    
risposta data geirha 23.02.2012 - 12:45
fonte
13

Come hai sottolineato, puoi eseguire

nohup nm-applet &  

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

    
risposta data desgua 22.02.2012 - 01:17
fonte
10

Una cosa a cui 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 fermerà 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 : maggiori dettagli in questa risposta l'ho scoperto più tardi.

    
risposta data krlmlr 31.03.2015 - 16:37
fonte
6

Usa (exec PROGRAM &> /dev/null & ) per consentire al PID di subshell di essere rilevato 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
    
risposta data Sergiy Kolodyazhnyy 30.11.2015 - 12:35
fonte
2

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

    
risposta data speter 05.03.2013 - 01:07
fonte
1

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. Puoi anche chiudere il terminale dopo aver eseguito questo comando.

Probabilmente, non correlato, ma esiste un sito Web meraviglioso che puoi usare per spiegare i comandi della shell. link

    
risposta data user3342981 28.06.2016 - 16:39
fonte
0

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é tu sei ancora aggiornato anche se stai lavorando sull'altra sessione.

    
risposta data leo 06.07.2016 - 00:15
fonte

Leggi altre domande sui tag