Aqui está uma maquete da minha versão à prova de balas. É manipulado para mostrar lógica. Ele roda no meu roteador OK.
#!/bin/sh
age_max_sec=50
LOCKFILE=lock.txt
if [ -e ${LOCKFILE} ]; then
echo "lockfile exists"
if kill -0 'cat ${LOCKFILE}'; then
echo "script runs in mem"
lock_date='date -r ${LOCKFILE} +%s'
now='date +%s'
lock_age=$(($now-$lock_date))
if [ $lock_ag e -gt $age_max_sec ]; then
echo "DoubleDDNS (no2runKILL)"
kill 'cat ${LOCKFILE}'
else
echo "DoubleDDNS (no2runOK), age $lock_age seconds, quit this run"
exit 1
fi
else
echo "not allready running, go ahead"
fi
fi
echo "working on"
# overkill???? just in case, scorched earth check.
filename=${0##*/}
for pid in $(pidof $filename); do
if [ $pid != $$ ]; then
echo "DoubleDDNS (no3runKILL)"
kill -9 $pid
fi
done
# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}
# main program here
rm -f ${LOCKFILE}
echo "done"
Acho que devo usar o arquivo de bloqueio se quiser verificar a idade da execução anterior. Então, faça um lockfile com pid. Se lockfile não for mais antigo que o limite de segundos, saia. Se for mais antigo, mate a instância anterior. No meu roteador, não tenho melhores formas disponíveis para verificações que fiz.
Eu preciso de verificação de terra queimada ou é um exagero? Depois que as verificações legítimas do lockfile são feitas, estou verificando novamente se há um processo remanescente mas quebrado ainda na memória e mato se encontrado. O problema é: eu não tenho como testá-lo até que um desastre real ocorra novamente e a limpeza regular não consiga limpá-lo. Se não for um exagero ...
Deve-se notar que a disponibilidade do serviço NTP pode influenciar bloqueios cronometrados e pílula de suicídio. Por exemplo. minha primeira execução do script acima ocorreria cerca de 4 segundos antes que o NTP consertasse o tempo. Então, devemos levar essas coisas em consideração.
A pílula de suicídio fornecida acima pelo DopeGhoti funciona perfeitamente. Então, agora é apenas uma questão de julgar qual combo usar. Ou todos eles? Lockfile, lançamento programado, terra queimada e suicídio. Hmm, parece um exagero, mas não vejo nenhum deles trabalhando contra outros, mas em perfeita harmonia (paranóica). Comentários são bem vindos.