如何使用 Monit 監視具有多個程序的服務?
我正在嘗試使用 monit 觀看郵件列表管理器 sympa。一個正在執行的 sympa 實例由用於列表管理的不同任務的多個程序組成(例如,用於歸檔電子郵件的單獨程序),但所有程序都使用單個 init 腳本啟動/停止。
理想情況下,monit 應該在任何服務失敗時提醒我,然後重新啟動 sympa,但只重新啟動一次。第一個解決方案如下所示:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" check process sympa_bounced with pidfile /var/run/sympa/bounced.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" check process sympa_bulk with pidfile /var/run/sympa/bulk.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop"
但是,如果我手動停止 sympa,init 腳本將被執行多次,對於我定義的每個服務執行一次(因為每個服務都失敗了)。
我的第二種方法是定義依賴關係,並且僅在任何子服務失敗時發出警報:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check process sympa_bounced with pidfile /var/run/sympa/bounced.pid if does not exist then alert check process sympa_bulk with pidfile /var/run/sympa/bulk.pid if does not exist then alert
但是由於子服務沒有重啟,所以主服務也不會重啟。所以我想我可以通過將 start/stop 設置為“假”重啟
/bin/true
:check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check process sympa_bounced with pidfile /var/run/sympa/bounced.pid start program = "/bin/true" stop program = "/bin/true" check process sympa_bulk with pidfile /var/run/sympa/bulk.pid start program = "/bin/true" stop program = "/bin/true"
這也不起作用,因為如果 sympa_bulk 失敗,則在 sympa 服務重新啟動之前不會創建 PID 文件,並且在 sympa_bulk 再次執行之前不會發生這種情況。
有沒有辦法監控這樣的服務,獲取所有子服務的警報消息,但只重新啟動一次服務,即使所有子服務同時失敗?
我找到了兩種可能的解決方案。兩者都不是最佳的,但在我的場景中工作:
- 對於每個子服務,只檢查 PID 文件是否存在,如果文件存在則假定服務線上。和以前一樣,主服務
sympa
依賴於子服務:check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check file sympa_bounced with path /var/run/sympa/bounced.pid if does not exist then restart check file sympa_bulk with path /var/run/sympa/bulk.pid if does not exist then restart
restart
對文件什麼都不做,但是因為sympa
依賴於子服務,所以會重啟。 2. 使用較新的 monit 版本,您還可以執行命令並將參數傳遞給命令:check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check program sympa_bounced with path "/usr/bin/pgrep --pidfile /var/run/sympa/bounced.pid" if does not exist then restart check program sympa_bulk with path "/usr/bin/pgrep --pidfile /var/run/sympa/bulk.pid" if does not exist then restart
與 類似
check file
,該restart
操作不會對程序執行任何操作,而是強制sympa
重新啟動服務。對於較舊的monit 版本(例如,Debian Wheezy 中的目前版本),您無法將參數傳遞給命令,因此您可以為每個使用相應參數
5.4
執行的服務編寫一個簡單的(單行)腳本。/usr/bin/pgrep
對於這兩種解決方案,如果任何子服務失敗或根本沒有執行,
sympa
則會重新啟動一次。sympa