Eu tenho um processo que é executado pelo script init.d em segundo plano. Por exemplo:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
Em certas condições, meu processo pode falhar e retornar. Existe alguma maneira (padrão) de como detectar sua falha e reiniciar automaticamente?
Respostas:
A maneira mais fácil seria adicioná-lo ao / etc / inittab , que é projetado para fazer esse tipo de coisa:
Por exemplo, você pode fazer isso:
fonte
/etc/inittab
funciona (ou até existe) se e somente se você tiver um sistema init baseado em sysvinit. Com o iniciante e com o systemd, não. É necessário instalar o busybox (shell muito primitivo, tornando o sysadm recuperar tarefas dolorosas, mas ele pode substituir um initd compatível com sysvinit) ou sysvinit (é um fóssil). Em um contêiner de docker, apenas o primeiro não é doloroso.O Buildroot possui três sistemas init possíveis, portanto, existem três maneiras de fazer isso:
BusyBox
init
Com isso, adicionamos uma entrada para
/etc/inittab
.Observe que o BusyBox
init
possui um/etc/inittab
formato idiossincrático . O segundo campo não tem sentido e o primeiro campo não é um ID, mas um nome de base do dispositivo.Linux "Sistema V"
init
Novamente, adicionamos uma entrada para
/etc/inittab
.systemd
Um escreve um arquivo de unidade em, digamos
/etc/systemd/system/myprocess.service
:Habilite isso para iniciar automaticamente na inicialização com:
Inicie-o manualmente com:
Leitura adicional
fonte
service mything start
ouservice mything stop
mais .... existe uma maneira de obter o melhor dos dois? ou seja, serviço sysvinit intransponível, mas também utilizá-lo via 'service'?Que tal criar um subshell com um loop que chama constantemente o mesmo processo?
Se terminar, a próxima iteração do loop continua e o inicia novamente.
Se o subshell morre, acabou. A única possibilidade nesse caso seria criar outro processo (eu o chamarei de necromante) que verifica se seu processo está ativo, inicie-o se não estiver e execute esse necromante com cron, para que você possa verificar regularmente.
O próximo passo seria saber o que poderia acontecer se o cron morrer, mas em algum momento você deve se sentir seguro e parar de se preocupar.
fonte
Você poderia fazer uso do Monit . É realmente fácil de usar e bastante flexível. Veja, por exemplo, esta configuração para reiniciar o processo do Tomcat em falha.
Ele também possui muitos exemplos de configuração para muitos casos de uso.
fonte
Se você não é um superusuário ou raiz e se o seu sistema Linux possui o Docker instalado, é possível criar uma imagem do docker do seu processo, usando o docker para reiniciar o processo se o sistema for reiniciado.
Arquivo: docker-compose.yml
Para iniciar o contêiner do docker,
Eu acho que é fácil lidar com meu próprio processo com reinicialização automática se eu não sou um super usuário do sistema.
Para um exemplo de exemplo de como criar uma imagem de janela de encaixe, veja um exemplo rápido:
Arquivo: Dockerfile
fonte
No meu caso, como uma solução rápida, modifiquei e usei a solução do @Trylks para quebrar o programa que estava lançando. Queria que terminasse apenas na saída limpa.
Deve ser executado na maioria das conchas:
fonte
Você pode usar restarter
Em sistemas mais recentes, use systemd que resolve todos esses problemas triviais
fonte