Como reiniciar automaticamente um processo em segundo plano do linux se ele falhar?

27

Eu tenho um processo que é executado pelo script init.d no plano de fundo. 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 detectar sua falha e reiniciar automaticamente?

    
por Honza 19.11.2012 / 09:13

6 respostas

13

A maneira mais fácil é adicioná-lo a / etc / inittab , que é projetado para fazer esse tipo de coisa:

respawn If the process does not exist, start the process. Do not wait for its termination (continue scanning the /etc/inittab file). Restart the process when it dies. If the process exists, do nothing and continue scanning the /etc/inittab file.

Por exemplo, você pode fazer isso:

# Run my stuff
myprocess:2345:respawn:/bin/myprocess
    
por 19.11.2012 / 20:27
23

O Buildroot tem três sistemas init possíveis, portanto, há três maneiras de fazer isso:

BusyBox init

Com isso, adiciona-se uma entrada a /etc/inittab .

::respawn:/bin/myprocess

Observe que o BusyBox init possui um formato /etc/inittab 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 "System V" init

Mais uma vez, adiciona-se uma entrada a /etc/inittab .

myprocess:2345:respawn:/bin/myprocess

systemd

Um escreve um arquivo de unidade em, digamos, /etc/systemd/system/myprocess.service :

[Unit]
Description=My Process

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target

Habilite isso para iniciar automaticamente na inicialização com:

systemctl enable myprocess.service

Inicie manualmente com:

systemctl start myprocess.service

Leitura adicional

por 09.01.2014 / 19:43
18

Que tal criar um subshell com um loop que chame constantemente o mesmo processo?

Se ela terminar, a próxima iteração do loop será ativada e iniciada novamente.

(while true; do 
    /bin/myprocess
done) &

Se a sub-camada morrer, acabou. A única possibilidade nesse caso seria criar outro processo (eu chamarei de necromante) que verifica se o seu processo está ativo, inicie-o se não estiver e execute este necromante com o cron, para que você possa verificar isso regularmente. / p>

O próximo passo seria imaginar o que poderia acontecer se o cron morre, mas em algum momento você deve se sentir seguro e parar de se preocupar.

    
por 19.11.2012 / 20:12
2

Você pode usar Monit . É muito fácil de usar e bastante flexível. Veja por exemplo esta configuração para reiniciar o processo do Tomcat em caso de falha.

check process tomcat with pidfile /var/run/tomcat.pid
   start program = "/etc/init.d/tomcat start"
   stop  program = "/etc/init.d/tomcat stop"
   if failed port 8080 type tcp then restart

Ele também tem muitos exemplos de configuração para muitos casos de uso.

    
por 25.01.2016 / 06:02
1

Se você não for um superusuário ou root, e se seu sistema Linux tiver o Docker instalado, você poderá criar uma imagem de encaixe do seu processo, usando o docker para reiniciar o processo se o sistema for reinicializado.

Arquivo: docker-compose.yml

version: "3"
services:
  lserver:
    image: your_docker_image:latest
    ports:
    - 8080:8080   # just use 8080 as an example
    restart: always  # this is where your process can be guaranteed to restart

Para iniciar seu contêiner docker,

docker-compose up -d

Acho fácil lidar com o meu próprio processo com a reinicialização automática, se eu não for um superusuário do sistema.

Para um exemplo de exemplo de como criar uma imagem docker, aqui está um exemplo rápido:

Arquivo: Dockerfile

FROM alpine:3.5

RUN apk update && apk upgrade && rm -rf /var/cache/apk/*
WORKDIR /app
COPY my-process-server /app
RUN ln -s /app/my-process-server /usr/local/bin/my-process-server

EXPOSE 8080

CMD ["my-process-server"]
    
por 19.06.2018 / 20:43
0

Você pode usar o login

start)
   restarter -c /bin/myprocess &
stop)
   pkill -f myprocess

Em sistemas de sistemas mais novos que resolvem todos esses problemas triviais

    
por 09.10.2017 / 14:19