Script di shell per riavviare un processo se genera un certo pezzo di testo


3

Ho un programma Python che, di tanto in tanto, si arresta in modo anomalo con una serie di eccezioni diverse, generalmente dovute a problemi di rete. L'unico modo per farlo funzionare è riavviarlo. Come scriverei uno script di shell per eseguire il processo, controllare continuamente se viene visualizzato uno degli output Errore in tal caso terminare il processo e riavviare il comando (chiamiamolo ./command.sh)?

Sarebbe bene che questo fosse in qualsiasi altra lingua (python / perl ecc.).


Perché non puoi semplicemente riparare il programma Python?
geirha,

Perché il pitone non è il mio forté
Callum Rogers,

1
Anche se fosse un programma di terze parti, che viene regolarmente aggiornato, il prossimo aggiornamento potrebbe solo riportare il problema ...
con-f-use

Anche questo è un problema, lo sto estraendo da un repository git ogni paio di giorni e sarebbe fastidioso aggiungere la modifica ogni volta / farlo funzionare / correggere i conflitti di fusione
Callum Rogers

Risposte:


3

Poiché python esce con un codice di ritorno! = 0 quando genera un'eccezione, puoi semplicemente eseguire questo script shell:

while ! ./command.sh ; do : ; done

Ovviamente se vuoi solo eseguire il comando sempre, scrivi:

while true ; do ./command.sh ; done

(questo presuppone che ./command.shnon si biforca e non esca)


Vedremo se funziona, ora aspettiamo solo un errore: p
Callum Rogers,

2

Ho fatto qualcosa di simile per recuperare ted (Torrent Episode Downloader) dai suoi crash regolari. Di seguito è lo script che ho usato. Lo spiegherò in ulteriori modifiche man mano che procederò.

Modifica: come funziona

Ted ha un file di registro. Dal momento che controlla nuovi episodi ogni mezz'ora, c'è un timestamp in quel registro, che non è più vecchio di mezz'ora. Ovviamente il timestamp non è presente se ted si è schiantato nel frattempo.

Modifica: come ciò potrebbe aiutarti

È possibile reindirizzare l'output del programma problematico in un file. Scrivi uno script simile al mio, che controlla questo file. Se trova lì la stringa errata, riavvia l'applicazione (e rimuove il file di output). Puoi eseguire lo script in un ciclo infinito o usare cron. Ho scelto di utilizzare cron, quindi ho meno inquinamento di processo e comunque i controlli non devono essere incredibilmente frequenti.

#!/bin/bash
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 con-f-use@gmx.net.
# Use permitted under MIT license:
# http://www.opensource.org/licenses/mit-license.php (NO WARRANTY IMPLIED)

teddir='/home/confus/ted'   # Location of the ted executable
logpath='/home/confus/.Torrent Episode Downloader/log.txt' # Location of ted's log

# Get the process id for ted so it can be killed later
pid=$(lsof "$teddir/ted.jar" | grep -m1 java )
set -- $pid
pid=$2
echo "Ted is running unter pid: $pid."

# Check if the log is recent
search=$(date "+%b %d, %Y @ {0,1}%l:[0-9]{2} %p")
search=$(cat "$logpath" | grep -oE "$search")

# If ted is running and the log is not recent, kill crashed process and
#+restart it.
if [ -n "$pid" ] && [ ! -n "$search" ]; then
    echo "Killig $pid."
    kill "$pid" || exit 1
    echo "Restarting ted..."
    cd "$teddir"
    /usr/bin/java -jar ted.jar noTray
fi

exit 0

Nel mio caso c'era ancora un processo attivo per ted dopo l'incidente, ma ted non stava facendo nulla. Uccide il processo, quindi puoi ovviamente saltare le parti pid.

PS Potrebbe essere o meno un brutto codice. Potrebbe esserci un modo molto migliore, ma funziona e l'ho messo insieme in un tempo molto breve.

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.