サーバーからクライアントにネットワーク接続のpingを送信する

サーバーからクライアントにネットワーク接続のpingを送信する

私はサーバーとクライアント コンピューターを所有しており、常にネットワーク上で実行する必要があります。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 )

関連情報