Come avviare un programma in background


9

Il programma Boblight non funziona in background. Non vi è alcuna differenza evidente tra l'esecuzione

sudo boblightd

e

sudo boblightd& 

Come posso risolvere questo problema che la console non bloccherà ulteriori input?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded

8
Di ':sudo boblightd > /dev/null 2>&1 &
Devnull

Se non lo stai facendo a scopo di apprendimento, usa dmenu. È semplice e fa abbastanza bene il lavoro.
Nishant,

Risposte:


22

Il [1] 2289comando after your background mostra che ha funzionato ed è stato effettivamente inserito in background.

Ma l'output del comando verrà comunque inviato al terminale, a meno che non si reindirizzi. Ecco il modo completo per farlo:

sudo boblightd >std.txt 2>err.txt &

Se vuoi che sia stdout che stderr passino allo stesso file:

sudo boblightd >std.txt 2>&1 &

E, naturalmente, se non ti interessa l'output di uno o entrambi i flussi, puoi inviare a /dev/nullinvece di un nome file.

sudo boblightd >/dev/null 2>err.txt &

(quell'esempio getta via l'output standard, ma mantiene stderr, nel caso in cui qualcosa vada storto.)


AGGIORNARE

Quanto sopra non si basa sulla conoscenza di boblightd. Vedo in un'altra risposta che ha una modalità demone, quindi dovrebbe essere usata invece in questo caso.

A proposito, quanto sopra presuppone sudoche non venga richiesta una password e che non si chiuderà la finestra del terminale. Per il primo, io normalmente uso normalmente sudo bash, quindi digitare boblightd >std.txt 2>err.txt &. Un altro modo è fare sudo lso un comando innocuo per assicurarsi che l'accesso venga memorizzato nella cache.

Per quest'ultimo, nohupè il comando magico per assicurarsi che rimanga in esecuzione anche dopo aver lasciato l'edificio. Andrebbe dopo il sudoe prima del comando effettivo. Es sudo nohup boblightd >std.txt 2>err.txt &. O sudo bashpoi nohup boblightd >std.txt 2>err.txt &, quindi exit(per lasciare la shell di root).


È anche importante notare che se si sudotenta di richiedere la password, fallirà perché i processi in background non possono leggere STDIN.
Patrick,

Grazie @Patrick. Avevo appena risposto al problema immediato nella domanda, ma poiché questo sta ottenendo una certa attenzione, ho aggiornato con la menzione di richiesta password e nohup.
Darren Cook,

5

Penso che puoi usare il comando nohup in questo modo:

nohup sudo boblightd &

questo metterà l'output del tuo comando nel file nohup.out nella directory corrente.

Inoltre puoi usare il comando screen in questo modo: prima crea uno schermo:

screen -S your-sreen-name

quindi esegui il tuo comando:

sudo boblightd

Per salvare lo schermo e tornare al terminale, digitare Ctrl+AD( Ctrl+Aè il suggerimento per screencui si desidera fare qualcosa e Dquindi "d" si attacca dalla sessione senza fermarlo).

ripristina lo schermo:

screen -d -r your-screen-name

4

Dovrai reindirizzare stdout e stderr a qualcos'altro che i loro valori predefiniti per nasconderli. Il commento di @ devnull mostra come farlo. Questo è un primo passo.

Se usi semplicemente &per staccare il tuo programma, questo verrà automaticamente ucciso quando ti disconnetti. Probabilmente non è quello che vuoi. Dovrai usare il nohupcomando per evitare questo:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Nota che sudoprobabilmente ti chiederà una password: non ne riceverà nessuna, e non noterai che ti sta chiedendo una, poiché ogni output / input viene reindirizzato. Hai comunque soluzioni diverse per raggiungere questo obiettivo:

  • Esegui un sudocomando prima, sudosalverà la tua password. Questo è il modo più veloce.
  • Rimuovere il &, fornire sudola password, quindi inviare il processo in background con CTRL + Z.
  • Può anche configurare sudo per non chiedere la password per questo specifico utente e coppia eseguibile. Tieni presente che potrebbe essere una possibile violazione della sicurezza, ...

È meglio avere il nohup prima di dopo il sudo? Come sudoottiene la password quando la esegui nohup?
Aaron Digulla,

1
Bene, questo è un buon punto: non lo farà. Hai più soluzioni qui: esegui prima un comando sudo, sudo salverà la tua password. Questo è il modo più veloce. Un altro sarebbe rimuovere il &, dare sudola password, quindi inviare il processo in background con ctrl + z. È inoltre possibile configurare sudoper non richiedere la password per questo utente specifico e questa coppia di eseguibili.

(L'ho aggiunto alla risposta.)

Di solito lo faccio sudo bash, quindi eseguo il nohupcomando dall'interno della nuova shell.

In realtà non è corretto che se si utilizza solo in &background il processo che verrà interrotto al logout. Solo se bash viene ucciso con un SIGHUP, allora SIGHUP farà il tuo programma. Ma la disconnessione non provoca un SIGHUP. Se digiti logouto usi CTRL + D, bash uscirà e lascerà il processo in esecuzione. SIGHUP viene inviato quando si chiude l'emulatore di terminale in una GUI.
Patrick,

2

Boblightd

Nel caso di boblightd l'output inviato a stderr è già acquisito nel suo file di registro (il valore predefinito è ~ / .boblight / boblightd.log ), quindi non è necessario catturarlo e può essere scartato. Inoltre, boblight non esegue il fork di default ma può essere fatto includendo -f nel comando.

Ti suggerisco di provare quanto segue:

sudo boblightd -f >/dev/null 2>/dev/null

(dettagli dalla documentazione del progetto )

Più generalmente

I processi avviati dalla shell termineranno quando la shell verrà chiusa. Come altri hanno sottolineato, l'uso Ctrl-Zdurante l'esecuzione di un processo in primo piano restituisce il controllo alla shell. Tuttavia, il processo viene messo in uno stato arrestato a questo punto. Il bg comando sarà necessario per riavviare il processo ma rimanere in background. Richiede un ID processo o il numero del lavoro (poiché i normali numeri di lavoro sono preceduti da una%), quindi usando il tuo secondo esempio potresti pubblicare

bg %1

o

bg 2289

Il processo ora verrà eseguito in background ma è ancora collegato alla shell. Il collegamento alla shell può essere interrotto usando il disowncomando, che salva la confusione con nohup / sudo. Come per bg, disownrichiede solo l'ID del processo o il numero del lavoro

per esempio

disown 2289

Ora puoi uscire dalla shell in modo sicuro come se avessi eseguito il processo con il nohupcomando


1

Dal momento che la risposta è già stata presentata nei commenti. Mi è sembrato bello postare un po 'di spiegazione su di esso come una risposta effettiva.

Quindi la strada da percorrere è: sudo boblightd > /dev/null 2>&1 &

Ci sono 3 parti importanti qui. Più importante è &alla fine della linea. Fa in modo che la shell non attenda il termine del comando prima di restituire il controllo. Elimina anche l'input standard dalla tastiera. Mette il lavoro in secondo piano.

Ma questo lascerebbe comunque l'output nella console. Per evitare ciò, è presente un >simbolo che reindirizza l'output standard ( /dev/nullin questo caso).

A questo punto è ancora possibile ottenere l'output dal comando chiamato get to screen. Questo sarebbe l'errore standard. Quindi, infine, c'è 2>&1magia. Ciò reindirizza l'output dal flusso di errori standard all'output standard.

2e 1provengono da descrittori di file standard. 0sarebbe stdin, 1- stdout, 2- stderr.

È possibile reindirizzare l'output su un file se necessario.

Esistono comandi progettati per interagire con i lavori in background. jobse fg.

Puoi anche giocare con soluzioni più avanzate come screencomando se necessario.

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.