Como reiniciar um processo automaticamente quando ele mata no linux / CentOS

3

Existe algum comando / script para gravar automaticamente para reiniciar um processo (depois de identificar o ID do processo) quando ele falha ou é eliminado.

exemplo, estou executando um arquivo bin executável e queria reiniciar automaticamente toda vez que ele falha ou é morto.

    
por Sekhar 11.01.2017 / 06:16

2 respostas

3

daemontools de Dan Bernstein foi projetado para fazer isso e começou uma família inteira de conjuntos de ferramentas que compartilham os mesmos mecanismos brutos:

Sob praticamente qualquer um deles, um grava um programa run que executa / é o daemon, e um processo de gerente ou supervisor de serviço simplesmente o monitora como um processo filho bifurcado usando os mecanismos Unix e Linux normais. Isso pode ser feito em todo o sistema com um gerenciador de serviços dedicado executado como o superusuário ou por usuário com gerenciadores de serviços individuais.

Todos esses conjuntos de ferramentas são coerentes e autoconsistentes, mas note que nenhum deles exige que se use qualquer uma das ferramentas além daquelas necessárias em qualquer situação específica. Pode-se também misturar e combinar. Pode-se usar execlineb de Laurent Bercot e todos os seus utilitários sob perp, ou meu intérprete de script nosh e todos os seus utilitários em runit; assim como alguém pode igualmente usar chpst de Gerrit Pape no meu service-manager .

Da mesma forma, você pode empregar uma execução de serviço por todo o sistema ou por usuário do systemd. Os arquivos da unidade systemd estão na mesma ordem de simplicidade que os scripts run , embora isso não seja imperativo, eles não fornecem o controle exato refinado sobre como o estado de execução do processo de serviço é configurado. É, é claro, 2017 e a primeira regra para migrar para o systemd aplica-se.

Todos eles fornecem o substrato básico de iniciar um daemon no bootstrap, parando e iniciando-o sob controle administrador / automatizado enquanto o sistema está rodando, e automaticamente reiniciando-o em vários casos de falha.

Leitura adicional

por 11.01.2017 / 13:04
2

Para expandir o comentário de Ipor Sircer sobre o uso de systemd

A partir da Documentação do RHEL 7 :

Systemd is a system and service manager for Linux operating systems. It is designed to be backwards compatible with SysV init scripts, and provides a number of features such as parallel startup of system services at boot time, on-demand activation of daemons, support for system state snapshots, or dependency-based service control logic. In Red Hat Enterprise Linux 7, systemd replaces Upstart as the default init system.

Basicamente systemd gerencia serviços e o sistema como um todo. Se você quer que um processo esteja sempre rodando, então você quer que ele se comporte como um serviço. Não é difícil criar arquivos de serviço personalizados.

Arquivos de serviço pertencem a /etc/systemd/system/NAME.service conforme documentação

Um exemplo de um arquivo de serviço personalizado do Documentação do RHEL 7 novamente:

[Unit]
Description=service_description
After=network.target

[Service]
ExecStart=path_to_executable
Type=forking
PIDFile=path_to_pidfile

[Install]
WantedBy=default.target

Sua descrição do que este arquivo faz:

Where:

service_description is an informative description that is displayed in journal log files and in the output of the systemctl status command.

the After setting ensures that the service is started only after the network is running. Add a space-separated list of other relevant services or targets.

path_to_executable stands for the path to the actual service executable.

Type=forking is used for daemons that make the fork system call. The main process of the service is created with the PID specified in path_to_pidfile. Find other startup types in Table 9.10, “Important [Service] Section Options”.

WantedBy states the target or targets that the service should be started under. Think of these targets as of a replacement of the older concept of runlevels, see Section 9.3, “Working with systemd Targets” for details.

De volta à pergunta original, se você usar systemd para transformar seu processo em um serviço, poderá usar systemd para garantir que seu serviço esteja sempre em execução.

A partir da Documentação do RHEL 7 novamente:

Another example is a configuration file that restarts the service after its main process exited, with a delay of 30 seconds:

[Service]
Restart=always
RestartSec=30

Se você acabou de adicionar a opção Restart=always na seção [Service] do seu arquivo de serviço, o serviço deverá reiniciar a qualquer momento em que for encerrado / sair, a menos que você o pare usando systemd .

    
por 11.01.2017 / 19:11

Tags