Não há como verificar de forma confiável e útil que um processo não relacionado está em execução: uma condição de corrida é sempre possível. Mesmo que você encontre uma maneira de detectar se o processo em que está interessado está em execução, ele pode ser eliminado imediatamente depois de ser visto ou, por outro lado, pode ser iniciado imediatamente depois que você o perdeu.
Se você controlar o programa ou a maneira como ele é executado, é possível reservar um recurso exclusivo, como um bloqueio de arquivo. No entanto, se você controlar a maneira como o programa é invocado, há uma maneira mais simples de controlá-lo: monitorá-lo de seu pai. Um processo é informado quando seu filho morre.
A maneira mais simples de garantir que um processo esteja sempre em execução é reiniciá-lo em um loop.
# sleep 1 avoids a tight loop if the process systematically fails to start
while sleep 1; do
nice …
ret=$?
if [ $ret -le 127 ]; then
msg="… exited with status $ret"
else
msg="… exited on signal $((ret-128))"
esac
mail -s "$msg" "$USER"
done
Existe um software de monitoramento mais robusto e mais potente. Veja Como definir o monitoramento adequado dos meus serviços de forma automatizada? Então, se um deles travar, ele reinicia automaticamente?