Monit

如何使用 Monit 監視具有多個程序的服務?

  • January 28, 2015

我正在嘗試使用 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 再次執行之前不會發生這種情況。

有沒有辦法監控這樣的服務,獲取所有子服務的警報消息,但只重新啟動一次服務,即使所有子服務同時失敗?

我找到了兩種可能的解決方案。兩者都不是最佳的,但在我的場景中工作:

  1. 對於每個子服務,只檢查 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

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