Eu fiz algo parecido para recuperar o ted (Torrent Episode Downloader) de suas falhas regulares. Abaixo está o script que usei. Vai explicar em mais edições como eu vou.
Edit: como funciona
Ted tem um arquivo de log. Como ele verifica novos episódios a cada meia hora, há um registro de data e hora nesse registro, que não é mais do que meia hora. Claro que o timestamp não está lá se o ted falhou no tempo médio.
Edit: Como isso pode ajudar você
Você pode redirecionar a saída do seu programa problemático para um arquivo. Escreva um script semelhante ao meu, que verifica esse arquivo. Se encontrar a cadeia incorreta, reinicia o aplicativo (e remove o arquivo de saída). Você pode executar o script em um loop infinito ou usar o cron. Eu escolhi usar o cron para ter menos poluição do processo e as verificações não precisam ser incrivelmente frequentes de qualquer maneira.
#!/bin/bash
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 [email protected].
# 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=
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
No meu caso, ainda havia um processo ativo para o ted após o travamento, mas ted não estava fazendo nada. Mata o seu processo, então você pode, claro, pular as partes pid.
P.S.
Pode ou não ser um código ruim. Pode haver uma maneira muito melhor, mas funciona, e eu o reúno em um tempo muito curto.