Linux

如果沒有監聽埠,則 Systemd 重新啟動服務

  • June 4, 2016

我在 Debian 8 中使用 Systemd 已經有一段時間了。我使用 Restart=on-failure 選項來喚醒服務以防發生故障。

我想知道如果服務沒有監聽特定埠(即使程序仍在執行),是否有辦法強制重啟服務。

我需要它的原因是因為我們正在開發新功能來解決這個問題,但這需要一段時間。同時,我們需要一個解決方法。

我開發了一個腳本來檢查該狀態:

#! /bin/bash
PORTS=( 1452 542 )
for port in ${PORTS[@]}; do
   netstat -anp | grep $port > /dev/null 2>&1
   if [ "$?" -ne 0 ]; then
       # Port blocked. Kill the running process and start it again after a while
done

這個腳本是使用 cron 定期觸發的。我知道這是一個骯髒的把戲。這就是為什麼我想將該行為集成到 Systemd 檢查中。那可能嗎?

先感謝您。

乾杯,

一種。

我建議您以不同的方式處理它並使用專用的監控工具來完成此操作。

我最喜歡的監控工具是monithttps ://packages.debian.org/jessie/monit

配置文件、本網站和其他地方有很多關於設置的範例。我將列出一個範例,讓您了解它的使用有多簡單,該範例使用 init.d 但是它可以很容易地轉換為使用 systemd。

要測試一個程序是否存在並且正在偵聽特定埠並在此測試失敗時啟動它:

check process example with pidfile /var/run/example.pid
start program = "/etc/init.d/example start"
start program = "/etc/init.d/example stop"
if failed host 192.0.2.10 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout

你可以省略協議 http部分,monit 將只做一個簡單的 tcp 連接來測試它。協議參數進行了更複雜的測試,以檢查某些東西是否真正響應,例如,http get 請求。

您需要確保程序或服務的啟動方式是在 /var/run 中創建相應的pid 文件。Monit 本身並不關心這些。通常,如果服務是通過 init 腳本或 systemd 啟動的,它應該在 /var/run 中有一個pid 文件。

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