Práticas recomendadas para daemons do Linux

1

Estou pesquisando informações sobre a execução de processos em segundo plano no Linux. Os requisitos básicos são:

  • Iniciar o processo e mantê-lo em funcionamento, não importa o que aconteça
  • Se o processo for encerrado por qualquer motivo, reinicie-o imediatamente
  • Ser capaz de iniciar o processo como um usuário específico

Além disso, alguns processos precisam ser executados não continuamente, mas periodicamente. Este é obviamente um trabalho para o cron, e mais do que provável é o que eu vou usar para isso. Mas, para processos contínuos, é uma história diferente.

No Mac OS X, eu uso o launchd para essa finalidade. O Launchd é o método canônico para iniciar processos no Mac OS X. O sistema operacional o utiliza para TODOS os serviços do sistema, portanto, não tenho escrúpulos em confiar nele. Até agora não encontrei um sistema semelhante para o Linux. Várias distros parecem ter seus próprios métodos (o Ubuntu, etc.) e ainda não consigo encontrar uma resposta direta sobre como /etc/rc.local, /etc/init.d/rc.local, / etc / initd /rc.local, ou / etc / init todos se relacionam e qual a diferença entre eles. Eles são diferentes em todos os sistemas. Acrescente a isso o fato de que "serviço iniciar / parar x" não funciona em todos os sistemas (e o Google não ajudou aqui) e você tem o que eu chamaria de confusão.

O que eu quero é um lugar onde eu possa salvar meus scripts onde eu possa reiniciar o sistema e tê-los lançados como daemons na inicialização (antes que qualquer usuário faça o login), então eles serão automaticamente reiniciados se eles terminarem. E eu quero que ele seja totalmente confiável e totalmente compatível com múltiplas distribuições, e não alguma reflexão tardia como o upstart.

Isso é possível?

    
por Justin Mrkva 16.11.2013 / 06:14

3 respostas

6

Desculpe, as distribuições Linux (em sua busca infinita para diferenciar-se e dificultar a vida dos administradores de sistema) têm cada padronizado em fazer a coisa de inicialização de forma diferente.

O mais próximo de um "padrão de distribuição cruzada" para os scripts de inicialização do Linux seria os níveis de execução de estilo do System V . Estes são obsoletos em alguns sistemas (por exemplo, a posição oficial do Ubuntu é que você deve usar o Upstart), mas eles ainda funcionam e provavelmente funcionarão por um bom tempo.

Os scripts init do SysV não suportam "reiniciar automaticamente" se o daemon travar - eles iniciam um daemon que deve cuidar de si mesmo.
Se você quer supervisão, você precisaria escrever / incluir seu próprio framework de supervisor. (Alternativamente, simplesmente escreva um software decente que não trava, que é a maneira tradicional de lidar com isso. Se o seu daemon é tão instável que precisa de supervisão extra para continuar o reinício, isso geralmente significa que você precisa fazer mais trabalho em torná-lo qualidade de produção.)

    
por 16.11.2013 / 07:10
3

Você esteve próximo com o novato - o que você precisa é systemd. Ele ainda não é totalmente suportado, mas lida com scripts de init SysV antigos (embora sem supervisão) e pode ser facilmente adotado para rodar em muitas distros. Não há melhor solução disponível por enquanto, mas se você preferir não alterar todo o init, talvez esteja interessado no monit daemon, que pode ser facilmente instruído a supervisionar praticamente qualquer serviço.

    
por 16.11.2013 / 07:55
1

What I want is ONE place I can save my scripts where I can reboot the system and have them launched as daemons at boot (before any user logs in), then have them automatically restarted if they ever terminate. And I want it to be rock solid reliable and fully compatible with multiple distros, not some afterthought like upstart.

Isso não existe. Mesmo se você se limitar às distribuições corporativas do Linux, você encontrará uma variedade de sistemas init, por exemplo,

  • SysVInit: Red Hat Enterprise Linux 5, SUSE Linux Enterprise 11
  • Upstart: Red Hat Enterprise Linux 6
  • Systemd: Red Hat Enterprise Linux 7, SUSE Linux Enterprise 12

A maneira mais "compatível" é escrever scripts sysvinit, já que o upstart e o systemd os suportam. No entanto, ele não suporta reiniciar automaticamente os serviços se eles morrerem. Tanto o upstart quanto o systemd suportam isso.

    
por 16.11.2013 / 15:14

Tags