Sugiro escrever o PID (no bash que está em $!
após iniciar um processo) em um arquivo, dos dois processos que você está iniciando ( psdash
e kegbot
).
Você pode usar ps --pid $(cat your.pid) | tr -s ' ' | sed 1d | cur -d' ' -f4
para ver se o processo está sendo executado.
Assim como uma nota lateral, você deve sempre verificar se o PID dentro de um arquivo .pid
é válido antes de agir sobre ele!
Pode acontecer de qualquer mecanismo que você use para remover o arquivo .pid
quando seus programas forem interrompidos (normalmente isso seria parte do próprio programa ou um invólucro shellscript), e há um PID "errado" em o arquivo .pid
. Se o arquivo .pid
sobreviver a uma reinicialização, o pior cenário seria um PID de algum outro processo em que você atuaria.
OK, aqui está uma solução possível, usando o kegbot
como exemplo:
Primeiro, você precisa de um script de wrapper. Para simplificar, vamos supor que tudo está acontecendo em seu $HOME
.
Assim, um invólucro simples ( run_kegbot.sh
) seria:
#!/bin/zsh
kegbot runserver xxx.xx.x.xxx:8008
echo $! > kegbot.pid
wait
rm -rf kegbot.pid
Esta é uma solução, se o kegbot
forks em segundo plano, etc., mas o PID é válido depois que ele é bifurcado. Eu não sei se kegbot
é capaz de lidar com arquivos PID em si, o que aliviaria você ter que lidar com arquivos PID você mesmo. Ou talvez você possa fazer com que kegbot
não seja bifurcado no plano de fundo e, em seguida, usar o próprio shell (adicionando &
ao final da linha 2) para gravar o arquivo PID e aguardar sua conclusão.
De qualquer forma, uma vez que você tenha feito a malarkey do arquivo PID, você precisa de algo assim em seu .profile
:
[ -e kegbot.pid ] && {
PID=$(cat kegbot.pid)
COMM=$(ps -p $PID -o comm=)
[ "x$COMM" != "xkegbot" ] && rm -f kegbot.pid
}
[ -e kegbot.pid ] || screen -d -m ./run_kegbot.sh
Mais uma vez, essa é apenas uma uma solução para o problema, mas a idéia geral é usar o PID do processo para verificar se está em execução ou não, e acima é uma maneira de fazer isso.
Alguns daemons mantêm seus arquivos PID em /var/run/
, se kegbot
e / ou psdash
fizerem isso, obviamente você não precisa de um script de wrapper, etc., pois você pode usar esses arquivos PID diretamente. / p>
Você definitivamente precisa verificar se o PID dentro de um arquivo PID é realmente o processo ao qual ele pertence. Uma reinicialização não autorizada e / ou o daemon travando pode deixar um arquivo PID zumbificado, etc. Isso é o que o primeiro teste do arquivo PID acima serve.