Avvio di un processo Linux in background


10

Sto cercando di creare uno script che avvia alcuni programmi

startup.sh

knetworkmanager
emesene
keepassx

Il problema è che quando eseguo lo script, avvia solo knetworkmanager. Questo perché lo avvierà, quindi attendi il completamento. Come posso avviare un programma senza aspettarlo? Non credo di poter semplicemente aggiungere "&" dopo ogni comando, poiché tutti i processi verranno comunque interrotti al termine dello script.

Risposte:


16

Quando la shell che esegue lo script termina, invia un segnale HUP ai processi che hai avviato. Se quelli non catturano il segnale, termineranno. Quindi se il solo utilizzo di e è sufficiente dipende dall'applicazione. Per sicurezza, usa nohup in questo modo:

nohup your-program >>/dev/null 2>>/dev/null &

Vedi le pagine man per nohup e uccidi per maggiori dettagli o leggi l' articolo di Wikipedia su nohup .


Rileggendo, è ambiguo se OP sta uscendo dalla shell chiamante o meno. Menziona solo l'uscita dallo script, non l'uscita dalla shell o dal terminale.
Adam Bellaire,

leggendo di nuovo la mia risposta, noterai che ho detto "quando esce la shell che esegue lo script". Supponendo che questa shell abbia un suo terminale virtuale (non una subshell o qualcosa del genere) ciò è corretto.
Kim,

@ Kim: È vero. La tua risposta va bene, sono solo sicuro che l'OP sta chiudendo la shell chiamante o meno.
Adam Bellaire,

10

No, i processi non devono essere interrotti al termine dello script se lo si utilizza &. Provalo.

knetworkmanager &
emesene &
keepassx &

2

Sulla base dei programmi di esempio forniti, sembra che tu stia cercando di avviare alcuni programmi all'avvio di KDE. In tal caso, dai un'occhiata alla funzione di avvio automatico di KDE. Questo articolo ne discute di più e fornisce istruzioni su come aggiungere programmi all'avvio automatico.


Anzi, è quello che sto cercando di fare. L'ho risolto ora, grazie.
Bart van Heukelom,

1

Come altri hanno già detto, utilizzare l' &operatore per inserire un comando in background nel momento in cui la shell lo esegue.

Se vuoi che le parti del componente vengano eseguite in ordine (piuttosto che in modo coincidente), ma desideri comunque che l'intero sfondo sia in background, usa una sotto-shell come questa:

(knetworkmanager; emesene; keepassx) &

oppure, se si desidera che l'operazione di ciascuna parte sia subordinata al completamento con successo della parte precedente, utilizzare:

(knetworkmanager && emesene && keepassx) &

0

L'aggiunta di un '&' dopo ogni comando funzionerà sicuramente. Significherebbe che quegli script o programmi continuerebbero ad essere eseguiti anche dopo il completamento di startup.sh.


0

Un'altra opzione sarebbe quella di avviare il processo come demone, usando / sbin / start-stop-daemon

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.