Отправить пинг сетевого подключения с сервера на клиент

Отправить пинг сетевого подключения с сервера на клиент

Итак, у меня есть сервер и клиентский компьютер, которые я должен постоянно держать работающими в сети. Иногда, поскольку я работаю в WLANсети, мой клиентский компьютер выходит из строя, и мне нужно его перезапустить. Поскольку я хочу гарантировать, что между моим сервером и клиентом есть активное соединение, я должен иметь какой-то способ регулярной проверки с клиентским компьютером, если он по сути жив или отвечает.

Моя проблема

Мне нужно сначала перезагрузить сеть, если клиент не получит никаких пакетов с моего сервера в течение пяти минут, а если сеть перезагрузилась, но по-прежнему не получает никаких пакетов с моего сервера, то она перезагрузит всю машину Linux.

Идея состоит в том, чтобы мой сервер действовал как сторожевой таймер, который будет отправлять пинг-запросы на подключение моему клиенту каждую минуту, и если клиент не получит ни одного такого пинга в течение пяти минут, он попытается повторно инициализировать себя.

Что я пробовал

Я попытался проверить с помощью этого локального скрипта, может ли он пинговать мой сервер с моего клиента, но он не сработал, поэтому я хочу вместо этого проверить со своей серверной стороны.

#!/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 )

Связанный контент