為什麼在檢查程序返回退出程式碼0時監控日誌錯誤和狀態失敗
問題 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 不會執行任何操作。
配置上還有一些話:
- 如果我理解正確(見這個問題),無頭伺服器將創建一個 PID 文件。所以你也可以檢查一下
check process
,也許還有一些send
/expect
魔術來驗證服務是否正在執行。- 如果您將
.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 退出。我仍然覺得我在這裡錯過了一些東西。;)您能否將所有三個執行檔都放到一個要點或其他東西上?