2010-04-26 19 views
5

Questo post descrive come mantenere in vita un processo figlio in uno script bash:Come riavviare automaticamente uno script python in caso di errore?

How do I write a bash script to restart a process if it dies?

Questo ha funzionato grande per chiamare un altro script BASH.

Tuttavia, ho cercato di eseguire qualcosa di simile dove il processo figlio è uno script Python, daemon.py che crea un processo figlio biforcuta, che viene eseguito in background:

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

Ora il comportamento è completamente diverso. Sembra che lo script python non sia più uno script di bash ma sembra aver "preso il controllo degli script di BASH PID - quindi non c'è più un wrapper BASH attorno allo script chiamato ... perché?

+3

Sarebbe utile sapere cosa c'è in daemon.py, ma dal nome suppongo che faccia un "exec" o qualunque sia l'equivalente python da mettere in secondo piano. –

+0

.... W h a t? –

+0

modificato per descrivere daemon.py – chris

risposta

5

Un daemon esegue le doppie forche come punto chiave del daemonizzazione stesso, quindi il PID che il processo padre non ha alcun valore (è scomparso subito dopo l'avvio del processo figlio).

Pertanto, un processo daemon deve scrivere il PID in un file in una "posizione ben nota" dove per convenzione il processo padre sa da dove viene letto; con questo approccio (tradizionale), il processo genitore, se vuole agire come un watchdog di riavvio, può semplicemente leggere il PID del processo daemon dalla posizione nota e controllare periodicamente se il daemon è ancora attivo e riavviarlo quando necessario.

Ci vuole un po 'di attenzione nell'esecuzione, ovviamente (un PID "vecchio" rimarrà per un po' nel file "posizione nota" e il genitore deve tenerne conto), e ci sono possibili varianti (il daemon potrebbe emettere un "battito cardiaco" in modo che il genitore possa rilevare non solo demoni morti, ma anche quelli che sono "bloccati per sempre", ad esempio a causa di un deadlock, poiché smettono di dare il loro "battito" [[tramite trasmissione UDP o simili] ] - etc etc), ma questa è l'idea generale.

0

Sembra che il comportamento sia completamente diverso perché qui il tuo "daemon.py" viene lanciato in background come demone.

Nell'altro collegamento si indicava che il processo che viene controllato è non da un daemon, non viene avviato in background. Il programma di avvio aspetta semplicemente per sempre che il processo figlio si fermi.

Vi sono diversi modi per superare questo problema. Quello classico è il modo in cui @Alex spiega, utilizzando un file pid in luoghi convenzionali.

Un altro modo potrebbe essere quello di costruire il cane da guardia all'interno del demone di esecuzione e demonizzare il cane da guardia ... questo sarebbe simulare un processo corretto che non si rompono a caso (cosa che non dovrebbe accadere) ...

3

Dovresti esaminare la proposta di miglioramento 311 (PEP) di Python here. In esso Ben suggerisce di includere una libreria daemon nella lib di python standard. Si occupa di molte informazioni sui demoni ed è una lettura abbastanza facile. L'implementazione di riferimento è here.

+0

Grazie per il riferimento Paul. Sembra utile – chris

-1

Utilizzare 'https://github.com/ut0mt8/simple-ha'.

semplice-ha

Stanco di keepalived, corosync, stimolatore cardiaco, battito cardiaco o qualsiasi altra cosa? Ecco un semplice demone che garantisce un battito cardiaco tra due host.Uno è attivo e l'altro è backup, lo script di avvio quando si cambia stato. Semplice implementazione, KISS. Produzione pronta (almeno funziona per me :)

La vita sarà troppo facile!

+1

Sebbene ciò possa teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. –

+0

Grazie per la segnalazione. Proverò ad aggiornare questo al più presto. –

Problemi correlati