Monit

為什麼在檢查程序返回退出程式碼0時監控日誌錯誤和狀態失敗

  • October 31, 2019

問題 1

我想用 monit 版本 5.25.1 監控一個無頭執行的 LibreOffice-Process。

這是我對這種方法的監控配置:

cat /etc/monit/conf.d/libreoffice


check program lo-check-8101 with path "/bin/bash /opt/libreoffice/chkloproc.sh TestLOPort8101 8101"
       with timeout 10 seconds
       if status != 0 then exec "/bin/bash /opt/libreoffice/loproc_is_down.sh"
       if status = 0 then exec "/bin/bash /opt/libreoffice/loproc_is_up.sh"

此 LibreOffice 實例正在偵聽埠 8101。

如果一切正常,檢查腳本將返回 0,如果該 LibreOffice 實例出現錯誤,則返回 101。我正在通過發送 HTML、請求 TEXT 並檢查響應來測試這個正在執行的 LibreOffice 程序的文本轉換。

動作腳本 (loproc_is_down.sh / loproc_is_up.sh) 正在添加/刪除一個 iptables 規則,以向正在執行的 haproxy 發出狀態,該 haproxy 正在埠檢查 LibreOffice 實例 / 程序……如果這聽起來有點複雜,對不起,但這不是我想在這裡談論的問題。

問題是,我不明白為什麼 monit 會記錄以下條目:

重啟後監控日誌

[CET Oct 29 16:58:18] info     : Starting Monit 5.25.1 daemon with http interface at [localhost]:2812
[CET Oct 29 16:58:18] info     : Monit start delay set to 10s
[CET Oct 29 16:58:28] info     : 'host1' Monit 5.25.1 started
[CET Oct 29 16:58:58] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 16:58:58] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 16:59:28] error    : 'lo-check-8101' status failed (0) -- no output

…以及“監控狀態”中的以下狀態螢幕:

monit status
Monit 5.25.1 uptime: 0m

Program 'lo-check-8101'
 status                       Status failed
 monitoring status            Monitored
 monitoring mode              active
 on reboot                    start
 last exit value              0
 last output                  -
 data collected               Tue, 29 Oct 2019 16:58:58

System 'host1'
 status                       OK
 monitoring status            Monitored
 monitoring mode              active
 on reboot                    start
 load average                 [0.03] [0.02] [0.01]
 cpu                          0.6%us 0.6%sy 0.0%wa
 memory usage                 543.9 MB [7.8%]
 swap usage                   0 B [0.0%]
 uptime                       20d 1h 11m
 boot time                    Wed, 09 Oct 2019 16:47:51
 data collected               Tue, 29 Oct 2019 16:58:58

在我看來,檢查腳本返回退出值 0 但狀態被報告/解釋為“狀態失敗”。

我不明白,為什麼 monit 在其日誌文件中報告“錯誤:… status failed (0)”。

除了解釋給定檢查腳本程序的最後一個退出程式碼之外,狀態還意味著什麼?


問題 2

還有另一個來自monit的反應,我無法理解,也許有人可以向我解釋一下?

當我試圖通過停止它來偽造一個損壞的 LibreOffice 程序時,monit 確實在一個週期後辨識出這一點,並且正在啟動想要/配置的操作腳本“loproc_is_down.sh”並將最後一個退出程式碼正確報告為 101,但使用日誌-線

“資訊:狀態成功(101)”

第一個循環,然後再用

“錯誤:狀態失敗(101)”

偽造失敗的監控日誌

[CET Oct 29 17:14:28] info     : 'lo-check-8101' status succeeded (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:14:28] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_down.sh'
[CET Oct 29 17:14:58] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.
[CET Oct 29 17:15:28] error    : 'lo-check-8101' status failed (101) -- Error: Existing listener not found. Unable start listener by parameters. Aborting.

相反的是再次啟動 LibreOffice 程序時:

服務再次執行時監控日誌

[CET Oct 29 17:15:58] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:15:58] info     : 'lo-check-8101' exec: '/bin/bash /opt/libreoffice/loproc_is_up.sh'
[CET Oct 29 17:15:58] info     : 'lo-check-8101' status succeeded (0) -- no output
[CET Oct 29 17:16:28] error    : 'lo-check-8101' status failed (0) -- no output
[CET Oct 29 17:16:58] error    : 'lo-check-8101' status failed (0) -- no output

看起來monit執行該檢查腳本,它返回退出程式碼0並啟動動作腳本“loproc_is_up.sh”並使用“狀態成功(0)”報告它

…但在接下來的周期中再次記錄“錯誤:狀態失敗(0)”。

我不理解monit概念/文件中“狀態”的含義……有人可以向我解釋嗎?

感謝您閱讀這篇長文,希望能幫助我回答。

Monit 用於擷取受監控實體的問題。

所以 - 逐行 - 你的配置告訴 Monit:

check program lo-check-8101 with path "/bin/bash /opt/libreoffice/chkloproc.sh TestLOPort8101 8101" with timeout 10 seconds

執行二進制。儲存退出程式碼和一些附加資訊。

       if status != 0 then exec "/bin/bash /opt/libreoffice/loproc_is_down.sh"

如果狀態不為 0,則會出現問題。現在執行一個二進製文件。

       if status = 0 then exec "/bin/bash /opt/libreoffice/loproc_is_up.sh"

如果狀態為 0,則會出現問題。現在執行一個二進製文件。- 我什至不知道這個電話的結果應該是什麼。這裡一切都好,那為什麼要執行一些事情呢?


可以這麼說:有了這個配置,就沒有“成功”(=一切都很好)的情況。

要優化它,你應該只發現 Monit 的問題:

check program lo-check-8101 with path "/opt/libreoffice/chkloproc.sh TestLOPort8101 8101"
   with timeout 10 seconds
   if status != 0 then exec "/opt/libreoffice/loproc_is_down.sh"
   if 2 restarts within 3 cycles then unmonitor

這意味著如果狀態為 0,Monit 不會執行任何操作。

配置上還有一些話:

  1. 如果我理解正確(見這個問題),無頭伺服器將創建一個 PID 文件。所以你也可以檢查一下check process,也許還有一些send/expect魔術來驗證服務是否正在執行。
  2. 如果您將.sh文件設置為執行檔(+x; ie. chmod +x /opt/libreoffice/*.sh)並且在這些文件中有正確的shebang,則可以在執行時省略/bin/bash以提高可讀性。

我對此的配置(不知道使用什麼協議:8101,假設 http)將更像這樣:

check process libre-local with pidfile "/var/run/libreoffice-server.pid"
   start program = "/usr/bin/systemctl start libreoffice-server" # Unit name is an assumption!
   stop program = "/usr/bin/systemctl stop libreoffice-server" # Unit name is an assumption!

   if failed
       port 8101
       protocol http
       request "/any_valid_entrypoint"
       for 2 cycles
   then restart

   # if loadavg (5min) per core > 1 for 5 cycles then restart
   if loadavg (5min) > 4 for 5 cycles then restart
   if totalmem > 2 GB for 5 cycles then restart
   if 3 restarts within 5 cycles then unmonitor

loadavg使用per core需要最新的 Monit 版本。所以它可能在你的發行版中不可用,所以我註釋掉了這一行;)


OP回復後編輯(我希望你得到通知):

(我們不能評論 < 50 Rep 真的很痛苦……)

如果我做對了,你必須轉換一些東西來獲取應用程序的狀態,如果轉換失敗,應用程序應該重新啟動。翻譯成監視器:

check program lo-check-8101 with path "CONVERT_HERE"
   with timeout 10 seconds
   if status != 0 then exec "/usr/bin/systemctl restart libreoffice-server"
   if 2 restarts within 3 cycles then unmonitor

CONVERT_HERE如果轉換順利,執行檔以 0 退出,如果轉換失敗,則以 <>0 退出。我仍然覺得我在這裡錯過了一些東西。;)

您能否將所有三個執行檔都放到一個要點或其他東西上?

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