2013-09-23 16 views
8

voglio fare uno script per essere auto-daemonizing, vale a dire, non c'è bisogno di invocare nohup $SCRIPT &>/dev/null & manualmente sul prompt della shell.Self-daemonizing bash script di

Il mio piano è quello di creare una sezione di codice come il seguente:

#!/bin/bash 
SCRIPTNAME="$0" 

... 

# Preps are done above 
if [[ "$1" != "--daemonize" ]]; then 
    nohup "$SCRIPTNAME" --daemonize "${PARAMS[@]}" &>/dev/null & 
    exit $? 
fi 

# Rest of the code are the actual procedures of the daemon 

È questo saggio? Hai alternative migliori?

+1

Si dovrebbe usare il doppio quotazioni intorno a '$ SCRIPTNAME' e' $ 1' almeno; altrimenti ti imbatti in problemi se ci sono spazi in questi valori. – Alfe

+0

@Alfe hai ragione. Ho dimenticato le virgolette. Grazie per la segnalazione! – pepoluan

risposta

8

Qui ci sono cose che vedo.

if [[ $1 != "--daemonize" ]]; then 

Shouln't che sia == --daemonize?

nohup $SCRIPTNAME --daemonize "${PARAMS[@]}" &>/dev/null & 

Invece di chiamare di nuovo lo script, si può solo evocare una subshell che è collocata in uno sfondo:

(
    Codes that run in daemon mode. 
) </dev/null >/dev/null 2>&1 & 
disown 

O

function daemon_mode { 
    Codes that run in daemon mode. 
} 

daemon_mode </dev/null >/dev/null 2>&1 & 
disown 
+2

Non c'è bisogno di parentesi nell'ultima versione. La funzione verrà comunque eseguita nella nuova sottoshell a causa di &. –

+0

Oh sì. Ho appena aggiunto la funzione 'function' quindi non l'ho notato molto grazie. – konsolebox

+0

Ah, grazie! Sì, sembra molto più elegante. '[[" $ 1 "! = --daemonize]]' è corretto. Fondamentalmente, se lo script non viene invocato usando il parametro '--daemonize', si rilancerà passando il parametro' --daemonize'. Tuttavia, posso vedere che la tua soluzione è molto più elegante, quindi il test è discutibile. Grazie! – pepoluan