Como tratar corretamente a exclusão de pid.file no script de serviço

4

Estou tentando escrever script de serviço para o aplicativo. Então eu posso controlar assim:

./myscript.sh start|stop|status

Na inicialização pid.file com o ID do processo criado e, com base nele, posso verificar o status e parar o processo. No comando stop eu removi pid.file - está tudo bem.

Mas se o aplicativo travar de maneira anormal - desligar, etc, pid.file não será removido e eu preciso removê-lo manualmente.

Como lidar corretamente com essas situações anormais no script?

    
por zella 17.12.2015 / 14:07

2 respostas

1

Você pode verificar se o pid está em execução e pertence ao seu aplicativo:

pid=$(< "$pidfile")   # a bash builtin way to say: pid=$(cat $pidfile)
if  kill -0 $pid &&
    [[ -r /proc/$pid/cmdline ]] && # find the command line of this process
    xargs -0l echo < /proc/$pid/cmdline | grep -q "your_program_name"
then
    # your application is running
    true
else
    # no such running process, or some other program has acquired that pid:
    # your pid file is out-of-date
    rm "$pidfile"
fi
    
por 17.12.2015 / 15:38
0

Os arquivos PID nunca devem ser excluídos, a menos que você tenha desinstalado o software que os criou.

Um arquivo PID é principalmente uma proteção contra a execução simultânea. Excluir o arquivo PID anula esse propósito para sempre. No exato momento em que você desvincula o arquivo PID, um número arbitrário de processos pode ter um descritor de arquivo aberto para ele e pode adquirir um bloqueio exclusivo nele pelo sistema operacional.

A ramificação else da resposta de @glenn_jackman deve realmente ser excluída.

Eu expliquei o problema subjacente em maior detalhe, incluindo um exemplo de código para reproduzir as condições de corrida resultantes em link .

    
por 11.11.2018 / 20:22