2009-03-21 2 views
14

Ho un demone che ho scritto usando Python. Quando è in esecuzione, ha un file PID situato in /tmp/filename.pid. Se il daemon non è in esecuzione, il file PID non esiste.Come posso verificare un file esiste ed eseguire un comando se non?

Su Linux, come è possibile verificare che il file PID esista e, in caso contrario, eseguire un comando per riavviarlo?

Il comando sarebbe

python daemon.py restart 

che deve essere eseguito da una directory specifica.

+1

La parte "che deve essere eseguita da una directory specifica" parte della descrizione sembra una ricetta per problemi. Attenzione: ripensateci se possibile. –

+0

duplicato: http://stackoverflow.com/questions/638975/how-do-i-tell-if-a-file-does-not-exist-in-bash/ – hop

+0

/tmp è un brutto percorso per mettere i file PID , dal momento che alcune distribuzioni hanno processi più puliti che cancellano i file da/tmp e gli utenti possono eliminare i file da lì per fare spazio. –

risposta

35
[ -f /tmp/filename.pid ] || python daemon.py restart 

-f controlla se il percorso dato esiste ed è un file regolare (solo -e controlla se esiste il percorso)

il [] eseguire il test e restituisce 0 in caso di successo, 1 altrimenti

la || è un C-like or, quindi se il comando a sinistra fallisce, eseguire il comando a destra.

Quindi la dichiarazione finale dice, se /tmp/filename.pid NON esiste, quindi avviare il daemon.

7

Se si tratta di script bash vi state chiedendo circa, qualcosa di simile a questo dovrebbe funzionare:

if [ ! -f "$FILENAME" ]; then 
    python daemon.py restart 
fi 

Una soluzione migliore potrebbe essere quella di guardare in lockfile

6

Le altre risposte vanno bene per rilevare l'esistenza di il file. Tuttavia, per una soluzione completa probabilmente dovresti controllare che il PID nel file pid sia ancora in esecuzione e che sia il tuo programma.

1

Un altro approccio per risolvere il problema è uno script che fa sì che il demone "rimane" vivo ...

Qualcosa di simile (nota: gestione del segnale dovrebbe essere aggiunto per il corretto avvio/arresto):

$PIDFILE = "/path/to/pidfile" 

if [ ! -f "$PIDFILE" ]; then 
    echo "Pid file exists!" 
    exit 1 
fi 

while true; do 
    # Write it's own pid file 
    python your-server.py ; 

    # force removal of pid in case of unexpected death. 
    rm -f $PIDFILE; 

    # sleep for 2 seconds 
    sleep 2; 

done 

In questo modo, il server resterà attivo anche se dovesse morire in modo imprevisto.

1

È inoltre possibile utilizzare una soluzione pronta come Monit.

1
ls /tmp/filename.pid 

Restituisce vero se il file esiste. Restituisce false se il file non esiste.

3
test -f filename && daemon.py restart || echo "File doesn't exists"