Esecuzione di programmi in background dal terminale


136

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 motivo, 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 il terminale aperto o occupare l'intero terminale?

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

nm-applet &

Ma questo non è molto utile in quanto tutti i processi avviati nel terminale vengono interrotti una volta chiuso il terminale.                                                                        


7
nohup 'command' & Questo sembra funzionare. Qualche problema con questo?
OVERTONE,

Risposte:


173

Di recente mi è piaciuto setsid. Inizia come se stessi eseguendo qualcosa dal terminale ma puoi disconnetterti (chiudere il terminale) e continua a funzionare.

Ciò è dovuto al fatto che il comando esegue il fork e mentre l'input arriva al terminale corrente, è di proprietà di un genitore completamente diverso (che rimane attivo dopo aver chiuso il terminale).

Un esempio:

setsid gnome-calculator

Sono anche abbastanza parziale a disowncui può essere usato per separare un processo dall'albero corrente. Lo si utilizza insieme alla e commerciale in background:

gnome-calculator & disown

Ho anche imparato a generare le conchiglie con parentesi. Questo semplice metodo funziona:

(gnome-calculator &)

E ovviamente c'è nohupcome hai detto. Non sono pazzo nohupperché ha la tendenza a scrivere ~/nohup.outsenza che me lo chieda. Se fai affidamento su questo, potrebbe essere per te.

nohup gnome-calculator

E per i processi a lungo termine, ci sono cose come screene altri muxer virtuali che mantengono in vita le sessioni tra le connessioni. Questi probabilmente non si applicano davvero a te perché vuoi solo un accesso temporaneo all'output del terminale, ma se vuoi tornare indietro qualche tempo dopo e visualizzare le ultime attività del terminale, lo schermo sarebbe probabilmente la scelta migliore.

Internet è pieno di screentutorial ma ecco un semplice avvio rapido:


Oli, nel caso di DISPLAY =: 0 unità - sostituisci quale di queste opzioni utilizzeresti e perché?
pazzo per il natty

4
@nuttyaboutnatty avvolgere il tutto nella propria sessione di shell: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. È praticamente la mia soluzione per fare in modo che si forni correttamente.
Oli

1
@nuttyaboutnatty Questo è ciò che intendo, ma non finiresti con due istanze in esecuzione perché --replacefa quello che sembra e in realtà termina la vecchia istanza. Eseguirlo la seconda volta dall'interno della sessione x finirebbe la copia associata a TTYn e ti permetterebbe di usarlo in futuro se ne avessi bisogno. C'è probabilmente un modo migliore per farlo, ma proprio quello che mi viene in mente ogni volta che ne ho bisogno.
Oli

1
Perfetto, quello che ha funzionato per me è stato il subshell "(gnome-calcolatore &)". Lo uso per avviare un'app console mono in background. Con le altre tecniche, l'app mono si bloccherebbe all'istante.
Nikolaos Georgiou,

2
Nota per i futuri utenti : la creazione di nohup.outpuò essere soppressa reindirizzando sia stdout che sterr in questo /dev/nullmodo:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

Ecco i due modi in cui vorrei andare. Innanzitutto, non eseguirlo da un terminale; premi Alt+ F2per aprire la finestra di dialogo Esegui ed eseguilo da lì (senza &).

Da un terminale, corri

nm-applet &

Ma NON chiudere il terminale da soli. Cioè, non premere il pulsante X per chiudere e non utilizzare File -> Esci dalla sua barra dei menu. Se chiudi il terminale in quel 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 exito 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 si chiuderà anche.

Fare tutto in una volta:

nm-applet & exit

È stupefacente! Non l'ho mai saputo e sembra che tu sia l'unica persona a menzionarlo. Sicuramente questo è il mio approccio preferito in un ambiente desktop. Peccato che non posso più
votare

Ho provato questo con un'applicazione diversa e non è riuscito: l' matlab & exitesecuzione come due comandi separati ha funzionato bene:matlab & exit
MattKelly

Mi chiedevo perché OP ha detto che la chiusura del terminale ha causato l'arresto anomalo dei suoi programmi in background. Non ho mai provato a chiudere un terminale con il pulsante "x" sulla finestra.
user1717828

il pulsante x è kill non esce in modo pulito, il comando exit lo fa. potresti invece rimappare il pulsante x in un comando di uscita ...
Tim Baker,

14

Come hai sottolineato, puoi correre

nohup nm-applet &  

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


Altre alternative? Solo per amor di conoscenza, non per nient'altro
OVERTONE il

Su wikipedia ( en.wikipedia.org/wiki/Nohup ) c'è un suggerimento da usare echo command | at nowche non sono riuscito a far funzionare.
desgua,

2
Mi chiedo come funzioni da un'interfaccia utente quando si fa doppio clic su un'icona o un programma.
OVERTONE,

execfornisce un'alternativa nohup <command> &per l'esecuzione di un processo in background e la restituzione del prompt della shell corrente.
JSStuball,

12

Una cosa che manca a molte altre risposte è come staccare un processo in esecuzione che attualmente blocca la shell. Nella maggior parte dei terminali e shell, Ctrl+ Zinterromperà il processo in esecuzione e tornerà a un prompt di input. Quindi, è possibile emettere

bg

per inviare il processo in esecuzione in background. Problema

fg

invece di riportare in primo piano il processo in esecuzione.

EDIT : maggiori dettagli in questa risposta che ho scoperto in seguito.


7

Utilizzare (exec PROGRAM &> /dev/null & )per consentire a PID di subshell di essere acquisito 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

Hmmm si (exec firefox)blocca il terminale fino a quando non esco da Firefox ... e chiudendo il terminale SIGHUPs la shell e la subshell
kos

Ho modificato la mia risposta. Testato con molti altri programmi. In questa versione non ho osservato Firefox o altri programmi che
bloccano

funziona bene per me
Zanna,

Non credo che l'uso di exec di bash sia necessario, potrebbe essere che tu abbia bisogno del PID per qualche motivo.
marinara,

2

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


1

Sebbene ci siano buone risposte sopra, vorrei dare i miei 2 centesimi su come uso MATLAB in background.

sudo -b matlab

Il -btag di sudo può eseguire applicazioni in background. È inoltre possibile chiudere il terminale dopo aver eseguito questo comando.

Probabilmente, non correlato ma c'è un sito Web meraviglioso che puoi usare per spiegare i comandi della shell. http://explainshell.com/explain/8/sudo


0

Non so che sia il modo giusto, ma ho appena iniziato un'altra sessione lasciando la precedente allone. Ad esempio, ho eseguito un semplice server Web sul mio lampone. quello web.py. quindi inizio una nuova sessione lasciandola sola. questo è tutto. è anche utile perché sei ancora aggiornato anche se stai lavorando sull'altra sessione.


2
Benvenuto in Ask Ubuntu! Raccomando di modificare questa risposta per espanderla con dettagli specifici su come eseguire questa operazione. (Vedi anche Come posso scrivere una buona risposta? Per consigli generali su quali tipi di risposte sono considerate più preziose su Ask Ubuntu.)
David Foerster,

0

Nel caso venga usato KDE, puoi anche usare kstart, che avvierà il tuo programma staccato dal terminale. Inoltre, assicura che l'ambiente KDE sia configurato correttamente per il comando. (Vedi kstart.cppil codice sorgente per riferimento . Come vedi da lì, usa KProcess::startDetachede KProcessda cui deriva QProcess, startDetachedavvia un nuovo processo e si stacca da esso.)

Simile è anche kde-openo xdg-openo gnome-open.


Allo stato attuale, sembra quasi più un commento che una risposta. Si prega di modificare ad espandersi. Non dare solo una fodera; spiega perché hai ragione, idealmente con citazioni. Le risposte senza spiegazione sono soggette a rimozione.
anonymous2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.