所以我有一台服务器和一台客户端计算机,我必须一直在网络上运行它们。有时,因为我在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 )