だから私はサーバーとクライアントコンピュータを持っていて、それらを常にネットワーク上で実行する必要があります。場合によってはWLAN
、ネットワーク上でクライアントシステムを実行しているため、再起動が必要な場合があります。サーバーとクライアントの間にアクティブな接続があることを保証したいので、クライアントシステムがアクティブであるか本質的に応答しているかを定期的に確認する必要があります。
私の質問
クライアントが5分以内に私のサーバーからそのような接続pingを受け取らず、ネットワークが再起動されたがまだ私のサーバーからそのようなパケットを受信できない場合は、まずネットワークを再起動する必要があり、その後Linuxシステム全体が再起動されます。 。
アイデアは、私のサーバーがウォッチャーとして機能し、1分以内にクライアントに接続pingを送信し、クライアントが5分以内にそのような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コマンドを使用して、私のサーバーで1分ごとにcronによって呼び出されます。
* * * * * /path/to/script/watchdog-server.sh
クライアント側では一時ファイルを削除しようとし、失敗した場合はカウンタが増え、3 の場合はネットワークを再起動し、5 の場合はコンピュータを再起動します。成功するとカウンタがリセットされます。
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 )