
我有monit
配置為在一對進程消耗過多 CPU 時終止它們,但一旦其中一個進程終止,monit summary
即使作業系統重新啟動該進程,也會報告該進程「未受監視」。
如何配置為「監視」進程重新啟動後的監視?
check process soagent
matching "soagent"
stop program = "/usr/bin/pkill -9 soagent"
if cpu > 20% for 1 cycles then stop
if cpu > 20% for 1 cycles then alert
check process callservicesd
matching "callservicesd"
stop program = "/usr/bin/pkill -9 callservicesd"
if cpu > 20% for 1 cycles then stop
if cpu > 20% for 1 cycles then alert
macOS 10.13.4,監控 5.25.2
答案1
問題是你只是告訴它停止這個過程,這也停止了對其的監視。
在這種情況下,最簡單的解決方案是編寫一個腳本,告訴 launchd 重新啟動進程(不幸的是,我無法具體幫助這一點,我對 macOS 不太了解),然後在 monit 中使用單一條件為每個服務配置運行腳本,如下所示:
if cpu > 20% for 1 cycles then exec "/path/to/script"
該exec
子句在觸發時仍會發送電子郵件警報,腳本將運行以重新啟動進程/服務,然後 monit 將繼續監視它,因為沒有被告知停止監視它。
假設您採用這種方法,您也可以從定義中刪除該行,因為除非您在服務上stop program
運行,否則不會使用該行。monit stop
編輯進一步澄清事情:
Monit 預計作業系統不會處理進程監督。換句話說,它假設它是唯一負責啟動或停止進程的東西,因此當你告訴它停止某些東西時,它會停止該進程,和停止監視它,因為它假設沒有任何東西會嘗試再次啟動它(因此有時在 Linux 上與 macOS 的 launchd 或 systemd 一起使用會有點痛苦)。
就您而言,您想要的是在進程使用過多處理能力時重新啟動該進程,並在發生這種情況時通知您。您可以透過兩種方式使用 monit 執行此操作:
- 為其定義一個
start program
andstop program
,如果使用單獨的進程管理程式作為您的 init 系統(macOS 就是這樣),則該命令應該是告訴它啟動或停止程式的命令,然後告訴 monit 在條件發生時重新啟動進程添加一個條件來獲取警報。在 macOS 上,您需要launchctl
命令來處理重新啟動。雖然這是首選且「正確」的方法,但使用起來launchctl
有點麻煩(似乎假設沒有人想要手動重新啟動服務),所以這不是我推薦的方法。 編寫將觸發重新啟動的腳本,然後指定該腳本的路徑作為
exec
條件的操作。exec
actions 在目前版本的 monit 中隱含發送警報,因此在這種情況下您不需要指定任何警報條件。在您的情況下,第一個服務的「腳本」可以是以下內容:#!/bin/bash /usr/bin/pkill -9 soaagent
然後第二個類似的事情。它唯一需要做的就是以某種方式觸發 launchd 重新啟動服務,它不需要自行重新啟動。本質上,這種方法只是告訴 monit 觸發重新啟動,就像您在上面嘗試執行的那樣,它只是以一種稍微乾淨的方式執行此操作,從而獲得您想要的結果。