Reinicia automaticamente um job Unix se ele cair?

2

Eu tenho um trabalho que gostaria de "daemonizar" no Unix: Eu quero que ele apareça quando o computador inicializar, e eu quero que ele reinicie se ele cair.

Uma maneira simples de fazer isso é configurar um cronjob que é executado a cada 10 ou 20 minutos. O cronjob deve reiniciar o aplicativo se ainda não estiver em execução.

Como escrevo esta última parte do script: "Se o trabalho não estiver em execução no momento, inicie o trabalho"?

    
por user13798 04.11.2009 / 01:56

7 respostas

1

Esta abordagem é rápida e barata e não à prova de balas:

#!/usr/bin/perl -w
$l = 'ps x';
if (not $l =~ /mzscheme/) {
        system('~/utils/src/plt/bin/mzscheme &');
}

Eu coloquei esse script em um arquivo cron.

    
por 04.11.2009 / 22:30
5

Se o seu programa for executado em primeiro plano, use o runit de Gerrit Pape. Vantagens:

  • É muito bem à prova de balas (baseado nos daemontools de Dan Berstein).
  • Ele é executado em uma ampla variedade de plataformas (portáteis).
  • É empacotado no Ubuntu e Debian (junto com acima ..).
  • É relativamente fácil de configurar (executar script, script de log, alguns links simbólicos).
por 04.11.2009 / 09:55
4

Eu uso Monit para essa finalidade, é gratuito e de código aberto. Faz o que você precisa e muito mais.

What Monit can do

Monit can start a process if it does not run, restart a process if it does not respond and stop a process if it uses too much resources. You can use Monit to monitor files, directories and filesystems for changes, such as timestamp changes, checksum changes or size changes. You can also monitor remote hosts; Monit can ping a remote host and can check TCP/IP port connections and server protocols. Monit is controlled via an easy to use control file based on a free-format, token-oriented syntax. Monit logs to syslog or to its own log file and notifies you about error conditions and recovery status via customizable alert

Eu também gosto da filosofia de design deles:

It is important for a system monitoring tool to just work - all the time and you should be able to trust it to do so. A system monitoring tool need to be non-intrusive and you should be able to forget about it once it's installed. That is, until sshd dies on your co-located server, 50 miles away. When this happens, it is good to know that you have installed this extra layer of security and protection - just wait a few seconds and Monit will restart the sshd daemon. It is also helpful to get an alert mail before the server disks are full or if your http server suddenly is slashdotted.

Monit is designed as an autonomous system and does not depend on plugins nor any special libraries to run. Instead it works right out of the box and can utilize existing infrastructure already on your system. For instance, Monit will easily integrate with init and can use existing runlevel rc-scripts to manage services. There are also flexibility for those special cases when you need a certain setup for a service.

Monit compiles and run on most flavors of UNIX. It is a small program and weights in at just over 300kB. There is support for compiling with glibc replacements such as uClibc if you need it to be even smaller.

Como você não tem acesso root, um script como este pode funcionar para sua necessidade de:

"If the job is not currently running, then start the job"

if [ $(ps ax | grep -v grep | grep "/usr/local/apache2/bin/httpd" | wc -l) -eq 0 ]
then
        echo "httpd Service not running"
        apachectl start
fi

o código acima foi criado e testado com o cron e o daemon http do Apache. Ele simplesmente procura sua string na lista atual de processos. Se forem encontradas 0 linhas, elas não estão sendo executadas, portanto, elas serão reiniciadas. Certifique-se de incluir grep -v grep para eliminar sua pesquisa da saída do processo. Tente usar o caminho inteiro para o binário para garantir que seja o serviço encontrado em suas consultas. Se você usar apenas httpd , por exemplo, ter httpd.conf aberto no vim fará com que o programa pense que o serviço httpd está sendo executado quando realmente não está. Claro, o seu método de iniciar o serviço também será diferente.

    
por 04.11.2009 / 02:45
1

Existem também soluções especialmente projetadas para funcionar como um cão de guarda e até executar scripts de serviços que não criam arquivos pid, etc. Um exemplo de tal solução é supervisor .

    
por 25.06.2014 / 10:03
0

Você pode usar um bloqueio de arquivo . O site explica como implementá-lo em python, mas deve ser bem simples descobrir em outros idiomas.

    
por 04.11.2009 / 02:20
0

Outra ideia (semelhante a de Jeffrey Aylesworth sugestão de bloqueio de arquivo , embora mais voltada para o mundo de scripts de shell do Unix) seria fazer com que sua tarefa cron verifique um arquivo PID (consulte relacionado perguntas no SO). Se o seu aplicativo daemonized não criar um arquivo PID por conta própria, você poderá envolvê-lo em um script de shell para fazer isso.

A ideia básica é esta:

  1. Inicie seu aplicativo a partir de um script que crie um arquivo PID (em algum lugar como /home/username/run/Foo.pid ) contendo seu PID.
  2. Em seu cron job, verifique se o arquivo PID existe.
    1. Se existir, verifique se o PID ainda está executando o aplicativo.
    2. Se não estiver em execução ou o arquivo PID não existir, o aplicativo morreu. Reinicie.

Se você quiser que o aplicativo Foo seja executado apenas uma vez, você pode até fazer tudo isso no script de inicialização e executá-lo como o trabalho agendado.

    
por 04.11.2009 / 04:53
0

Você pode usar o systemd. A maioria dos sistemas modernos já usa.

Use Type=Simple

Type=simple (default): systemd considers the service to be started up immediately. The process must not fork. Do not use this type if other services need to be ordered on this service, unless it is socket activated.

Fonte: link

e Restart=always

Por favor, não faça a forking-magic, já que outras ferramentas já fazem isso (e melhor do que você e eu podemos fazer isso).

    
por 12.07.2016 / 17:07