Monit não está reiniciando o serviço

1

Eu tenho um script node.js que eu quero daemonizar em um sistema Funtoo (eu marquei como Gentoo, já que eu não acho que há algo realmente específico para o Funtoo aqui vs o Gentoo), e eu faço isso com o seguinte init script:

#!/sbin/runscript

depend(){
        need redis
}

start(){
        ebegin "Starting myapp"
        NODE_ENV="prod" start-stop-daemon --start --background --make-pidfile -1 /var/log/myapp.log -2 /var/log/myapp.error --chdir /opt/myapp --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js
        eend $?
}

stop(){
        ebegin "Stopping myapp"
        start-stop-daemon --stop --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js
        eend $?
}

Com isso, posso iniciar e interromper o serviço usando o script de inicialização ou o rc-service. Então, para garantir que ele continue em caso de erro, eu uso monit com a seguinte configuração:

check process myapp with pidfile "/var/run/myapp.pid"
        start program = "/sbin/rc-service myapp start"
        stop program = "/sbin/rc-service myapp stop"
        if failed port 8123 protocol HTTP
                request /myapp.client.js
                with timeout 10 seconds
                then restart

Eu posso ver que o monit monitora com êxito o aplicativo e detecta quando ele cai, já que quando ele falha, recebo esse preenchimento do meu log:

Apr 24 21:05:35 [monit] 'myapp' trying to restart_
Apr 24 21:05:35 [monit] 'myapp' start: /sbin/rc-service_
Apr 24 21:06:05 [monit] 'myapp' failed to start_

A execução de monit no console no modo detalhado não oferece nada muito mais útil:

'myapp' Error testing process id [30106] -- No such process
'myapp' process is not running
'myapp' trying to restart
'myapp' Error testing process id [30106] -- No such process
'myapp' Error testing process id [30106] -- No such process
'myapp' start: /sbin/rc-service
'myapp' Error testing process id [30106] -- No such process
'myapp' Error testing process id [30106] -- No such process
 * WARNING: myapp has already been started

O que parece estar acontecendo é que ele nunca está executando o comando stop, então o arquivo pid ainda existe, então start-stop-daemon não o traz. No entanto, não tenho certeza de como alterar esse comportamento, ou se eu o tiver configurado incorretamente (usei o Gentoo / Funtoo por anos, mas esta é minha primeira ocasião para escrever um script de inicialização, e esta é minha primeira vez usando monit).

Então, em suma, o que me falta fazer para monit reiniciar com sucesso meu serviço?

ATUALIZAÇÃO:

A resposta de @ aseq me fez pensar um pouco, e não sei bem por que não pensei nisso antes. Basta alterar a linha start program no arquivo de configuração para:

start program = "/sbin/rc-service myapp restart"

Faz com que se comporte como esperado. Os logs ainda estão um pouco mal-humorados, pois start-stop-daemon reclama de no matching processes found ao tentar parar, mas ainda assim volta.

    
por Matt Sieker 24.04.2012 / 23:19

1 resposta

2

Você está no caminho certo em que o monit falha ao iniciá-lo porque o arquivo PID ainda existe.

Já corri para esses problemas antes e a solução que usei foi criar um script de inicialização para o serviço em particular, usando algo como /etc/init.d/skeleton (que está no debian) como um modelo (ou rc.local ), certificando-se de que um arquivo PID está sendo criado e excluído conforme apropriado (usando start-stop-daemon et al).

Eu não acho que realmente haja outra solução, pois o monit não lida com a exclusão ou a criação de arquivos PID. Qualquer que seja o script usado para iniciar e parar o serviço, ele precisa criar e excluir adequadamente os arquivos PID.

    
por 24.04.2012 / 23:39