Trabalhar com o problema obsoleto do pidfile após o reinício rápido mata o meu daemon

4

Estou usando o Red Hat Linux (RHEL5) em uma VM (VMWare). Eu escrevi um daemon que deve ficar correndo o tempo todo e ser executado automaticamente na inicialização.

Ontem à noite, o host da VM teve um problema irrecuperável de hardware e a VM parou abruptamente. Quando voltou, meu daemon não começou porque o pidfile ainda existia.

Aparentemente isso se chama A Síndrome do pidfile Stale , mas não tenho certeza qual é a melhor abordagem de longo prazo para mitigá-la. Estou pensando que o script de inicialização em /etc/rc.d* deve excluir o pidfile antes de iniciar o daemon, mas o script de gerenciamento de serviço em /etc/init.d deve permanecer o mesmo, então coisas como service mydaemon start não contaminam o pidfile.

/etc/rc.d/rc6.d tem apenas um link simbólico para o script em /etc/init.d/ , então como devo mudar a forma como ele se comporta apenas na inicialização? Eu posso fazer um script adicional com maior precedência no rc.d dirs, mas parece hacky. Alguém também sugeriu adicionar lógica como "se tempo de atividade for menor que 1 minuto, deletar o pidfile", mas isso também parece hacky.

Quaisquer pensamentos, soluções ou melhores práticas?

    
por Nathan 23.02.2011 / 20:00

3 respostas

3

Use daemontools e veja Processo Gestão .

    
por 23.02.2011 / 20:25
2

Obrigado pelas dicas @Dennis e @coredump.

Eu descobri algumas informações adicionais que me ajudaram a desvendar o mistério.

  1. Eu me perguntei por que todos os outros daemon se recuperaram bem. Acontece que há código em /etc/rc.d/rc.sysinit para limpar todos os pidfiles em /var/run e /var/lock na inicialização.

  2. Eu configurei meu daemon para colocar seu pidfile em outro lugar devido a problemas com o SELinux, impedindo-me de "usar arquivos potencialmente rotulados incorretamente".

Por isso, ainda não consertei os problemas do SELinux, mas a resposta é "coloque seu pidfile em /var/run ou /var/lock e ele funcionará da próxima vez"

    
por 24.02.2011 / 03:26
1

O script é o mesmo, o processo de inicialização apenas executa a ação 'start' nos scripts do sysvinit.

Por que você não verifica se o pid no arquivo pid está certo, e se não o exclui e cria um novo com o pid correto?

EDIT : Você pode usar o pidfile para ver se o processo ainda existe. Ou faça o contrário. Verifique os scripts do Red Hat, tenho certeza de que eles têm algumas funções auxiliares para fazer isso, como pidofproc .

    
por 23.02.2011 / 20:06