Shell-Script

Shell命令/腳本來查看主機是否還活著?

  • October 12, 2021

我試圖找出更多方法來查看給定主機是否已啟動,僅使用 shell 命令(主要是 bash)。理想情況下,它可以同時使用主機名和 IP 地址。現在我知道的唯一本地方式是 ping,可能集成到這裡描述的腳本中。還有其他想法嗎?

Ping 非常適合快速響應主機是否連接到網路,但它通常不會告訴您主機是否處於活動狀態,或者它是否仍在按預期執行。這是因為 ping 響應通常由核心處理,因此即使系統上的每個應用程序都崩潰了(例如由於磁碟故障或記憶體不足),您仍然經常會收到 ping 響應,並且可能會認為機器是當情況完全相反時正常執行。

檢查服務

通常您並不真正關心主機是否仍然線上,您真正關心的是機器是否仍在執行某些任務。因此,如果您可以直接檢查任務,那麼您將知道主機都已啟動並且任務仍在執行。

例如,對於執行 Web 伺服器的遠端主機,您可以執行以下操作:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
 echo "$TARGET alive and web site is up"
else
 echo "$TARGET offline or web server problem"
fi

如果它執行 SSH 並且您為無密碼登錄設置了密鑰,那麼您還有更多選擇,例如:

if ssh "$TARGET" true; then
 echo "$TARGET alive and accessible via SSH"
else
 echo "$TARGET offline or not accepting SSH logins"
fi

這通過 SSH 進入主機並執行true命令然後關閉連接來工作。只有當該命令可以成功執行時,該ssh命令才會返回成功。

通過 SSH 進行遠端測試

您可以擴展它以檢查特定程序,例如確保mysqld在機器上執行:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
 echo "$TARGET alive and running MySQL"
else
 echo "$TARGET offline or MySQL crashed"
fi

當然,在這種情況下,您最好monit在目標上執行類似的東西以確保服務保持執行,但它在您只想在機器 A 上執行某些任務的腳本中很有用,只要機器 B 準備好了.

這可能類似於在執行之前檢查目標機器是否安裝了某個文件系統rsync,這樣如果輔助文件系統由於某種原因沒有安裝,您就不會意外填滿其主磁碟。例如,這將確保/mnt/raid在繼續之前安裝在目標機器上。

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
 echo "$TARGET alive and filesystem ready to receive data"
else
 echo "$TARGET offline or filesystem not mounted"
fi

沒有客戶的服務

有時沒有簡單的方法可以連接到服務,您只想查看它是否接受傳入的 TCP 連接,但是當您連接telnet到相關埠上的目標時,它只是坐在那裡並且不會斷開您的連接,這意味著這樣做在腳本中會導致它掛起。

雖然不是很乾淨,但您仍然可以在timeoutnetcat程序的幫助下做到這一點。例如,這會檢查機器是否接受 TCP 埠 445 上的 SMB/CIFS 連接,因此即使您沒有登錄密碼或 CIFS 客戶端工具沒有登錄密碼,您也可以查看它是否正在執行 Windows 文件共享。已安裝:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
 echo "$TARGET alive and CIFS service available"
else
 echo "$TARGET offline or CIFS unavailable"
fi

ping 測試主機是否處於活動狀態和連接狀態的方法。(如果主機還活著但斷開連接或響應緩慢,您無法將其與當機區分開來。)

該命令支持的選項ping因係統而異。您需要確保它不會永遠循環,但如果它沒有收到回复,它會在幾秒鐘後返回。

使用 FreeBSD 和 Linux iputils,ping -c 1 -W 1 >/dev/null發送一個 ping 並等待 1 秒。您不需要解析輸出:如果命令收到 ping 返回,則返回 0,否則返回非零(未知主機名、沒有到主機的路由、沒有回复)。某些實現可能需要不同的標誌(例如-w,而不是-W在 FreeBSD 上),請查看您系統上的手冊。

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
 echo "$hostname_or_ip_address is alive"
else
 echo "$hostname_or_ip_address is pining for the fjords"
fi

引用自:https://unix.stackexchange.com/questions/190163