所以我有一台伺服器和一台客戶端計算機,我必須一直在網路上運行它們。有時,因為我在WLAN
網路上運行客戶端計算機,所以我需要重新啟動它。因為我想保證我的伺服器和客戶端之間存在活動連接,所以我必須以某種方式向客戶端電腦發送定期檢查,如果它本質上是活動的或響應的。
我的問題
如果客戶端在五分鐘內沒有從我的伺服器收到任何此類連接ping,並且如果網絡已重新啟動但仍然沒有從我的伺服器收到任何此類資料包,我需要首先重新啟動網絡,它將重新啟動整個Linux 機器。
這個想法是讓我的伺服器充當看門狗,每分鐘向我的客戶端發送一個連接 ping,如果客戶端在五分鐘內沒有收到任何此類 ping,它將嘗試重新初始化自身。
我嘗試過的
我嘗試使用這個本地腳本來檢查它是否可以從我的客戶端 ping 我的伺服器,但它不起作用,所以我想從我的伺服器端進行檢查。
#!/bin/bash
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "restarting network at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
service networking restart
sleep 60
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "rebooting at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
reboot
fi
fi
我有什麼想法可以在 Linux 中實現這一點嗎?
答案1
我透過ssh
在客戶端上建立臨時檔案「解決」了我的問題
ssh -o ConnectTimeout=5 USER@CLIENT_HOST '/usr/bin/touch /tmp/watchdog.hook'
這是由 cron 在我的伺服器上每分鐘使用下面的 cron 命令調用的
* * * * * /path/to/script/watchdog-server.sh
在客戶端,我嘗試刪除臨時文件,如果失敗,計數器將增加,如果它等於三,它將重新啟動網絡,如果等於五,它將重新啟動電腦。如果成功,它將重置計數器。
counter_file="/tmp/watchdog.counter"
if [ ! -f "$counter_file" ]; then
printf '0\n' >"$counter_file"
fi
counter_curr=$(< "$counter_file")
rm /tmp/watchdog.hook
if [ $? -eq 0 ]; then
counter_curr=0
else
(( ++counter_curr ))
if [ "$counter_curr" -eq 3 ]; then
echo "No network connection, restarting wlan0 at $(date)"
/sbin/ifdown 'wlan0'
sleep 5
/sbin/ifup --force 'wlan0'
elif [ "$counter_curr" -ge 5 ]; then
echo "No network connection, rebooting machine at $(date)"
/sbin/shutdown -r now
fi
fi
printf '%s\n' "$counter_curr" >"$counter_file"
我們希望在客戶端上運行腳本之前等待 30 秒,因此我們將其添加到 cron 中:
* * * * * ( sleep 30 ; /path/to/script/watchdog-client.sh )