如何在 Linux 中監視服務並在停止時重新啟動

如何在 Linux 中監視服務並在停止時重新啟動

實際上我不太確定是否應該使用 Shell 腳本,或者是否已經有一些方法了。但無論我們使用什麼方法,我都希望保持服務始終運作。

apache2個例子吧。然後 ..

  • 每當apache2服務已停止或未運行,我希望它自動啟動(或重新啟動)。
  • 更簡單地說,我想保留一個服務一直啟動並運行。

(也許我可以給出一個公平的頻率來檢查,如果進行即時檢查是問題所在。所以可以說,每 5 分鐘一次)

我能想到的唯一方法是使用帶有 Cron Tab 的 Shell 腳本。

  • 請問有什麼聰明的解決方法嗎?

謝謝!

答案1

2018 年 3 月更新

這個答案現在已經很老了,自從它被寫出來以來,systemd 已經贏得了 Linux 上的 pid1 戰爭。因此,您可能應該創建一個系統單位,如果 systemd 內建於您的發行版(這是大多數發行版)。

下面的答案為後代保留。


上面的 monit 答案是有效的,但我想我會提到一些替代方案:

值得記住的是,您的作業系統已經解決了進程管理問題。傳統上,Linux 使用 sysvinit,它基本上是您在 init.d 中看到的腳本的集合。然而它非常愚蠢並且無法監視進程,init.d 腳本很複雜並且它被替換是有充分理由的。

更現代的作業系統開始取代 sysvinit,領跑者是 Upstart 和 Systemd。 Debian 傾向於 systemd,Ubuntu 開發並幾乎已經過渡到 Upstart,並且像 Debian Redhat/CentOS/Fedora 一樣正在轉向 systemd。因此,如果您使用的作業系統已經取代了 sysvinit,我建議您使用內建的作業系統。這些腳本比初始化腳本更容易編寫。

我用過runit並且很喜歡它,但最容易使用的是supervisor。它也有很好的文檔記錄,幾乎可以在任何地方工作,並且打包在所有主要發行版中。

但無論你做什麼,請不要使用 shell 腳本。這種方法有很多問題!

答案2

iptables這是一個很糟糕的例子,因為它實際上並不是正在運行的服務或守護進程,而是核心的一部分。你不能真正「停止」iptables,你只能給它一個配置,「停止」它涉及給它一個空白配置。事實上,我的 Linux 系統曾經崩潰過,但使用的連接埠轉送設定iptables仍然有效。

無論如何,有一個名為monit會做你想做的事。如果您使用的是 Debian,那就另當別論了apt-get install monit。學習起來有點複雜,但非常靈活。

答案3

我們正在使用這個簡單的腳本來發出警報並在服務未運行時啟動該服務,您也可以添加更多服務。

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

答案4

為了添加到 init/svc 監督的長列表中,作為 S6 的子目錄,區塊上有一個新的孩子 66,它以快速、輕巧、用戶友好的方式處理 s6 服務管理和日誌記錄。這是 Obarun-Linux 官方文檔的鏈接https://web.obarun.org/software

這是關於如何使用 66 軟體和理解 s6 的常見問題解答http://sysdfree.wordpress.com/266

由於其穩定版本僅發現一個與 4.20-->5.0 的核心變更相關的錯誤,因此所有其他報告的問題都與人們學習新事物有關。如果服務管理必須變得比這更簡單,那麼最好切換到 ms-windows(Linus 禁止)。要在現實生活中了解它是如何運作的,只需下載 Obarun live.iso 並使用它即可。安裝服務及其 66 個腳本啟用它們、終止它們、查看它們的日誌、停止它們並啟動它們(啟用時)、將服務集中到樹中並將服務樹全部啟動和停止、單獨擁有用戶級服務從系統。它完成了 s6 擅長的事情,讓使用者更容易利用 s6 下的防彈系統。

可以在這裡找到圖像下載:https://web.obarun.org/index.php?id=74 MD5檢查文件https://repo.obarun.org/iso/

除了 init 和服務管理之外,s6/66 不依賴系統上的任何其他東西。它是基礎系統的一層,讓軟體的其餘部分自行工作,init/svc-mgmt 是盲目的。所有 s6 和 66 都是用 C 寫的,它不是 linux 特定的,也不是 glibc 特定的。 Skarnet(s6 作者)的伺服器已經運行了近十年,在 musl 定制構建的系統上沒有多次暫停。 Alpine、Void 和 Adelie 目前在其儲存庫中也有 s6 軟體,Adelie 預設使用它進行服務監管。 Void 現在也攜帶 66。我不知道是否以及在多大程度上有人將 s6 移植到 xxBSD 或其他 xxIX 系統。

相關內容