그래서 저는 서버와 클라이언트 컴퓨터를 가지고 있고 그것들을 항상 네트워크에서 실행해야 합니다. 때로는 WLAN
네트워크에서 클라이언트 시스템을 실행하고 있기 때문에 다시 시작해야 할 때도 있습니다. 내 서버와 클라이언트 사이에 활성 연결이 있음을 보장하고 싶기 때문에 클라이언트 시스템이 활성화되어 있거나 본질적으로 응답하는지 주기적으로 확인해야 합니다.
내 질문
클라이언트가 5분 이내에 내 서버로부터 그러한 연결 핑을 수신하지 못하고, 네트워크가 다시 시작되었지만 여전히 내 서버로부터 그러한 패킷을 수신하지 못하는 경우, 먼저 네트워크를 다시 시작해야 하며 그러면 전체 Linux 시스템이 다시 시작됩니다. .
아이디어는 내 서버가 감시자 역할을 하여 매분 내 클라이언트에 연결 핑을 보내고, 클라이언트가 5분 이내에 그러한 핑을 받지 못하면 자체적으로 다시 초기화를 시도하는 것입니다.
내가 시도한 것
내 클라이언트에서 내 서버를 핑할 수 있는지 확인하기 위해 이 로컬 스크립트를 사용해 보았지만 작동하지 않으므로 내 서버 측에서 확인하고 싶습니다.
#!/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
클라이언트 측에서는 임시 파일을 삭제하려고 시도하고 실패하면 카운터가 증가하고 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 )