รีบูตโดยอัตโนมัติหากไม่มีการเชื่อมต่อ wifi ในช่วงเวลาหนึ่ง


14

ดูเหมือนว่าเซิร์ฟเวอร์ Raspberry Pi ของฉันจะสูญเสียการเชื่อมต่อ wifi หลังจากเวลาสุ่มและไม่สามารถกู้คืนโดยอัตโนมัติได้

โดยปกติการรีบู๊ตด้วยมือจะช่วยแก้ปัญหาได้

ฉันต้องการให้รีบูตโดยอัตโนมัติหากไม่มี wifi หลังจากผ่านไปประมาณ 30 นาที ฉันจะทำสิ่งนั้นได้อย่างไร


5
คุณได้ลองใช้อินเทอร์เฟซที่ลงมาและนำมันกลับมา? วิธีการเกี่ยวกับการยกเลิกการโหลดและการโหลดโมดูลเคอร์เนลสำหรับการ์ดไร้สายของคุณ? อาจมีอย่างอื่นที่คุณสามารถทำการรีเซ็ตการ์ดโดยไม่ต้องรีบูตเครื่อง
hololeap

1
ใช่สิ่งนี้อาจใช้ได้เช่นกัน แต่ปัญหาหลักที่นี่คือวิธีการตรวจจับสิ่งนี้โดยอัตโนมัติแล้วดำเนินการตามความเหมาะสม
หนีบ

คำตอบ:


12

นี่คือคำตอบของ Warwick เป็นหลักเพียงแค่มีคำแนะนำทีละขั้นตอน


  1. สร้างเชลล์สคริปต์ต่อไปนี้ในโฟลเดอร์โฮมของคุณ:

    check_inet.sh

    #!/bin/bash
    
    TMP_FILE=/tmp/inet_up
    
    # Edit this function if you want to do something besides reboot
    no_inet_action() {
        shutdown -r +1 'No internet.'
    }
    
    if ping -c5 google.com; then
        echo 1 > $TMP_FILE
    else
        [[ `cat $TMP_FILE` == 0 ]] && no_inet_action || echo 0 > $TMP_FILE
    fi
    
  2. เปลี่ยนการอนุญาตเพื่อให้สามารถเรียกใช้งานได้

    $ chmod +x check_inet.sh
    
  3. แก้ไขการ/etc/crontabใช้sudoและเพิ่มบรรทัดต่อไปนี้ (แทนที่yournameด้วยชื่อผู้ใช้จริงของคุณ):

    */30 * * * * /home/yourname/check_inet.sh
    

5

วิธีหนึ่งคือการใส่รายการใน cron ของรูทที่รันสคริปต์ทุก ๆ 30 นาที สคริปต์จะทดสอบการเชื่อมต่อไร้สายบางทีอาจใช้pingและเขียนผลลัพธ์ไปยังไฟล์ใน / tmp - 1 สำหรับการเชื่อมต่อที่มีอยู่ 0 ถ้าไม่มี การวนซ้ำครั้งต่อไปของสคริปต์จะตรวจสอบไฟล์นั้นและถ้าเป็น 0 และการเชื่อมต่อ WiFi ยังไม่ดีให้เรียกใช้init 6คำสั่ง


3

ฉันคิดว่าวิธีแก้ปัญหา hololeap ใช้งานได้

โซลูชันของฉันจะตรวจสอบทุก ๆ N นาที (ขึ้นอยู่กับวิธีที่คุณกำหนดค่า crontab ของคุณ) สำหรับการเชื่อมต่อเครือข่ายที่ใช้งานได้ หากการตรวจสอบล้มเหลวฉันจะติดตามความล้มเหลว เมื่อนับความล้มเหลวคือ> 5 ฉันพยายามที่จะรีสตาร์ท wifi (คุณสามารถรีบูต Raspberry ถ้ารีสตาร์ท wifi ล้มเหลวตรวจสอบความคิดเห็น)

นี่คือ repo ของ GitHub ที่มีสคริปต์เวอร์ชันล่าสุดเสมอ: https://github.com/ltpitt/bash-network-repair-automation

ที่นี่ตามนโยบายทั่วไปของ stackexchange (คำตอบทั้งหมดไม่ควรมีเพียงแค่ลิงค์) รวมถึงไฟล์ network_check.sh คัดลอกและวางลงในโฟลเดอร์ใด ๆ ที่คุณต้องการคำแนะนำในการติดตั้งอยู่ในความคิดเห็นของสคริปต์

#!/bin/bash
# Author:
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown and fping with the following command:
# sudo apt-get install ifupdown fping
#
# 2) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Let's clear the screen
clear

# Write here the gateway you want to check to declare network working or not
gateway_ip='www.google.com'

# Here we initialize the check counter to zero
network_check_tries=0

# Here we specify the maximum number of failed checks
network_check_threshold=5

# This function will be called when network_check_tries is equal or greather than network_check_threshold
function restart_wlan0 {
    # If network test failed more than $network_check_threshold
    echo "Network was not working for the previous $network_check_tries checks."
    # We restart wlan0
    echo "Restarting wlan0"
    /sbin/ifdown 'wlan0'
    sleep 5
    /sbin/ifup --force 'wlan0'
    sleep 60
    # If network is still down after recovery and you want to force a reboot simply uncomment following 4 rows
    #host_status=$(fping $gateway_ip)
    #if [[ $host_status != *"alive"* ]]; then
    #    reboot
    #fi
}

# This loop will run network_check_tries times and if we have network_check_threshold failures
# we declare network as not working and we restart wlan0
while [ $network_check_tries -lt $network_check_threshold ]; do
    # We check if ping to gateway is working and perform the ok / ko actions
    host_status=$(fping $gateway_ip)
    # Increase network_check_tries by 1 unit
    network_check_tries=$[$network_check_tries+1]
    # If network is working
    if [[ $host_status == *"alive"* ]]; then
        # We print positive feedback and quit
        echo "Network is working correctly" && exit 0
    else
        # If network is down print negative feedback and continue
        echo "Network is down, failed check number $network_check_tries of $network_check_threshold"
    fi
    # If we hit the threshold we restart wlan0
    if [ $network_check_tries -ge $network_check_threshold ]; then
        restart_wlan0
    fi
    # Let's wait a bit between every check
    sleep 5 # Increase this value if you prefer longer time delta between checks
done

แก้ไข 1/26/2018: ฉันได้ลบไฟล์ชั่วคราวเพื่อให้สคริปต์ทำงานในหน่วยความจำและหลีกเลี่ยงการเขียนบนการ์ด SD ของ Raspberry


1
สคริปต์นี้หลีกเลี่ยงการรีสตาร์ทเมื่อมีการยกเลิกการเชื่อมต่อชั่วคราว ยอดเยี่ยมขอบคุณ!
wezzix

1
คุณดูเหมือนจะทำการเปลี่ยนแปลงที่สำคัญในสคริปต์นี้ ตามที่ฉันเข้าใจแล้วเวอร์ชันก่อนหน้านี้จะทำการส่งครั้งเดียวทำสิ่งต่าง ๆ (รวมถึงการอัปเดตไฟล์ tmp) และออก มันไม่มีลูปใด ๆ ค่อนข้างขึ้นอยู่กับ cron เพื่อให้ทำงานได้ทุกห้านาที หากเครือข่ายหยุดทำงานสำหรับการตรวจสอบติดต่อกันห้าครั้ง (เช่นใช้เวลาประมาณครึ่งชั่วโมง) สคริปต์จะทำสิ่งต่างๆเพื่อพยายามรีเซ็ตเครือข่าย นี่ดูเหมือนจะเป็นคำตอบที่ดีสำหรับคำถามแม้ว่าข้อเท็จจริงที่ว่ามันเขียนไปยังไฟล์ tmp นั้นเป็นข้อเสียเปรียบเล็กน้อย … (ต่อ)
สกอตต์

(ต่อ) ... รุ่นใหม่มีห่วงและการตรวจสอบเครือข่ายทุกห้าวินาที หากเครือข่ายไม่ทำงานสำหรับการตรวจสอบติดต่อกันห้าครั้ง (เช่นใช้เวลาประมาณครึ่งนาที ) สคริปต์จะพยายามรีเซ็ตเครือข่าย (ดูเหมือนว่าจะแตกต่างจากคำถามที่ถาม) และที่นี่มันแปลก ๆ หลังจากตรวจพบความล้มเหลวของเครือข่ายห้าครั้งติดต่อกันและรีเซ็ตเครือข่ายสคริปต์จะออก (และบังเอิญมันออกโดยไม่ตรวจสอบว่าเครือข่ายกลับมาจริงหรือไม่) … (ต่อ)
Scott

(ต่อ) … แต่ตราบใดที่เครือข่ายสคริปต์หยุดทำงานตลอดไปรอเครือข่ายล้มเหลว ในขณะเดียวกัน cron จะรีสตาร์ทสคริปต์ทุก ๆ ห้านาที หากเครือข่ายใช้งานได้ถึงหนึ่งชั่วโมงจะมีสคริปต์ทำงานอีกหนึ่งโหล และถ้าเครือข่ายล้มเหลวแล้วบรรดากระบวนการโหลจะทำสงครามกับแต่ละอื่น ๆ แบบไม่พร้อมทำifdownและifupอาจจะแก้ไขเครือข่ายและอาจจะไม่ได้ ……………………………………ทุก…………ทุก……………………ทุก……………………………ทุก…ทุกเมื่อ…ถ้าหากฉันเข้าใจผิด … (ต่อ)
สกอตต์

(ต่อ) ... (1) หากคุณกำลังจะทำการออกแบบใหม่ที่สำคัญของคำตอบที่โพสต์มานานกว่าหนึ่งปีคุณควรพูดในสิ่งที่คุณทำ “ ฉันได้ลบไฟล์ชั่วคราวเพื่อให้สคริปต์ทำงานในหน่วยความจำ” ไม่ใช่คำอธิบายที่เพียงพอสำหรับการเปลี่ยนแปลงของคุณ (2) ดูเหมือนว่าคุณมีคอลเลกชั่นหมุดสี่เหลี่ยมหมุดกลมรูสี่เหลี่ยมและรูกลมและคุณยังไม่ได้จับคู่ให้ถูกต้อง คุณควรแก้ไขสคริปต์เพื่อออกเมื่อเห็นว่าเครือข่ายทำงานอยู่หรือแก้ไขสคริปต์ให้ทำงานตลอดไปและเปลี่ยน crontab เพื่อเริ่มสคริปต์เพียงครั้งเดียว (เช่นในเวลาบูต)
สกอตต์

0

ฉันดัดแปลงสคริปต์ของ Pitto สำหรับเกตเวย์ mtac loraWAN ของ multitech ของฉัน (ไม่มี fping) ฉันยังเพิ่มไฟล์บันทึก

#!/bin/bash
# Author: 
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown with the following command:
# sudo apt-get install ifupdown
#
# 2) Create files in any folder you like (ensure that the filename variables, set below,
# match the names of the files you created) with the following commands:
# sudo touch /home/root/scripts/network_check_tries.txt &&
#                               sudo chmod 777 /home/root/network_check_tries.txt
# sudo touch /home/root/scripts/N_reboots_file.txt      &&
#                               sudo chmod 777 /home/root/N_reboots_file.txt
# sudo touch /home/root/scripts/network_check.log       &&
#                               sudo chmod 777 /home/root/network_check.log
#
# 3) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If additionally you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Specify the paths of the text file where the network failures count, reboot count,
# and log will be held:
network_check_tries_file='/home/root/network_check_tries.txt'
N_reboots_file='/home/root/N_reboots_file.txt'
log_file='/home/root/network_check.log'

# Save file contents into corresponding variables:
network_check_tries=$(cat "$network_check_tries_file")
N_reboots=$(cat "$N_reboots_file")


# If host is / is not alive we perform the ok / ko actions that simply involve
# increasing or resetting the failure counter
ping -c1 google.com
if [ $? -eq 0 ]
then
    # if you want to log when there is no problem also,
    # uncomment the following line, starting at "date".
    echo 0 > "$network_check_tries_file" #&& date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file"
else
    date >> "$log_file" && echo -e "-- Network is down... -- \n" >> "$log_file" && echo "$(($network_check_tries + 1))" > "$network_check_tries_file"
fi

# If network test failed more than 5 times (you can change this value to whatever you
# prefer)
if [ "$network_check_tries" -gt 5 ] 
then
    # Time to restart ppp0
    date >> "$log_file" && echo "Network was not working for the previous $network_check_tries checks." >> "$log_file" && echo "Restarting ppp0" >> "$log_file"
    killall pppd
    sleep 20
    /usr/sbin/pppd call gsm
    sleep 120
    # Then we check again if restarting wlan0 fixed the issue;
    # if not we reboot as last resort
    ping -c1 google.com
    if [ $? -eq 0 ]
    then
        date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file" && echo 0 > "$network_check_tries_file"
    else
        date >> "$log_file" && echo -e  "-- Network still down after ifdownup... reboot time!-- \n" >> "$log_file" && echo 0 > "$network_check_tries_file" && echo "$(($N_reboots + 1))" > "$N_reboots_file" && reboot
    fi
fi

(1) ทำไมคุณยังพูดถึงifupdownถ้าคุณไม่ใช้มัน / พวกเขา? (2) ทำไมคุณเปลี่ยนgateway_ipจากตัวแปรเป็นค่าคงที่ฮาร์ดโค้ด
สกอตต์

สวัสดีสกอตต์ฉันลืมที่จะลบความคิดเห็น ifdown ifdown ฉันลืมเปลี่ยน gatewy_ip hardcoded
3036425

ดี! ฉันได้เพิ่มเวอร์ชันใหม่ที่ไม่ได้ใช้ไฟล์ temp (การเขียนบน SD ของ Raspberry นั้นไม่ใช่ความคิดที่ยอดเยี่ยม) คุณสามารถตรวจสอบได้ในคำตอบของฉัน
Pitto

สคริปต์นี้สืบทอดปัญหาสองประการที่อยู่ในสคริปต์ต้นฉบับของ Pitto (ซึ่งได้รับการแก้ไขในภายหลัง): (1) หากเครือข่ายเริ่มต้นที่ 00:00:01 (หนึ่งวินาทีหลังเที่ยงคืน) สคริปต์จะไม่ ตอบสนองจนถึง 00:35 (เช่น 35 นาทีต่อมาในการตรวจสอบที่เจ็ด) เพราะถึงแม้ว่ามันจะเพิ่มค่าในnetwork_check_tries_fileไฟล์ (เมื่อpingล้มเหลว) มันจะไม่เพิ่มnetwork_check_triesตัวแปร … (ต่อ)
สกอตต์

(ต่อ) …ดังนั้นสคริปต์จึงทำงานเจ็ดครั้ง (เวลา 00:05, 00:10, 00:15, 00:20, 00:25, 00:30, และ 00:35) โดยมีnetwork_check_triesค่าเท่ากับ 0, 1, 2, 3, 4, 5 และ 6 - และเป็นเพียงการเรียกใช้ครั้งที่เจ็ด ( network_check_triesเท่ากับ 6) ที่การif [ "$network_check_tries" -gt 5 ]ทดสอบสำเร็จ เนื้อหานี้เป็นพฤติกรรมที่ถูกต้อง เท่าที่สคริปต์รู้เครือข่ายอาจลดลงในเวลา 00:04:59 ดังนั้นจึงต้องใช้เวลาเจ็ดครั้งติดต่อกันเพื่อให้แน่ใจว่าคุณใช้เวลา 30 นาที … (ต่อ)
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.