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.