Gentoo

監控不重啟服務

  • April 24, 2012

我有一個 node.js 腳本,我想在 Funtoo 系統上進行守護程序(我標記為 Gentoo,因為我認為這裡的 Funtoo 與 Gentoo 並沒有什麼特別之處),我使用以下初始化腳本執行此操作:

#!/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 $?
}

有了這個,我可以使用 init 腳本或 rc-service 很好地啟動和停止服務。然後,為了確保它在發生錯誤時保持正常,我使用帶有以下配置的 monit:

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

我可以看到 monit 確實成功地監控了應用程序,並檢測到它何時出現故障,因為當它崩潰時,我得到這個填充我的日誌:

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_

從控制台以詳細模式執行 monit 並沒有提供任何幫助:

'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

似乎正在發生的事情是它從不執行停止命令,因此 pid 文件仍然存在,因此start-stop-daemon不會啟動它。但是,我不完全確定如何更改此行為,或者是否配置錯誤(我使用 Gentoo/Funtoo 多年,但這是我第一次編寫初始化腳本,這是我第一次使用監控)。

所以,簡而言之,讓 monit 成功重啟我的服務我缺少什麼?

更新:

@aseq 的回答讓我思考了一下,我不太清楚為什麼我之前沒有想到這一點。只需將start program配置文件中的行更改為:

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

使其行為符合預期。日誌仍然有點脾氣暴躁,因為在嘗試停止時start-stop-daemon抱怨,但它仍然會恢復。no matching processes found

您在正確的路徑上 monit 無法啟動它,因為 PID 文件仍然存在。

我之前遇到過這些問題,我使用的解決方案是為特定服務創建一個初始化腳本,使用 /etc/init.d/skeleton (在 debian 上)之類的東西作為模板(或 rc.local),使確保正在適當地創建和刪除 PID 文件(使用 start-stop-daemon 等)。

我不認為真的有另一種解決方案,因為 monit 不處理刪除或創建 PID 文件。無論您使用哪個腳本來啟動和停止服務,它都需要正確創建和刪除 PID 文件。

引用自:https://serverfault.com/questions/382758