如何配置為「監視」進程重新啟動後的監視?

如何配置為「監視」進程重新啟動後的監視?

我有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 執行此操作:

  1. 為其定義一個start programand stop program,如果使用單獨的進程管理程式作為您的 init 系統(macOS 就是這樣),則該命令應該是告訴它啟動或停止程式的命令,然後告訴 monit 在條件發生時重新啟動進程添加一個條件來獲取警報。在 macOS 上,您需要launchctl命令來處理重新啟動。雖然這是首選且「正確」的方法,但使用起來launchctl有點麻煩(似乎假設沒有人想要手動重新啟動服務),所以這不是我推薦的方法。
  2. 編寫將觸發重新啟動的腳本,然後指定該腳本的路徑作為exec條件的操作。 execactions 在目前版本的 monit 中隱含發送警報,因此在這種情況下您不需要指定任何警報條件。在您的情況下,第一個服務的「腳本」可以是以下內容:

    #!/bin/bash
    /usr/bin/pkill -9 soaagent
    

    然後第二個類似的事情。它唯一需要做的就是以某種方式觸發 launchd 重新啟動服務,它不需要自行重新啟動。本質上,這種方法只是告訴 monit 觸發重新啟動,就像您在上面嘗試執行的那樣,它只是以一種稍微乾淨的方式執行此操作,從而獲得您想要的結果。

相關內容