Secara otomatis reboot, jika tidak ada koneksi wifi untuk waktu tertentu

13

Tampaknya server Raspberry Pi saya kehilangan koneksi wifi setelah waktu acak dan entah bagaimana tidak dapat pulih secara otomatis.

Biasanya reboot yang dilakukan dengan tangan menyelesaikan masalah.

Saya ingin membuatnya reboot secara otomatis jika tidak ada wifi setelah sekitar 30 menit. Bagaimana saya bisa melakukan itu?

penjepit
sumber
5
Sudahkah Anda mencoba menurunkan antarmuka dan mengembalikannya? Bagaimana dengan membongkar dan memuat kembali modul kernel untuk kartu nirkabel Anda? Mungkin ada hal lain yang dapat Anda lakukan untuk mereset kartu tanpa me-reboot.
hololeap
1
ya ini mungkin juga akan berfungsi, tetapi masalah utama di sini adalah bagaimana mendeteksi ini secara otomatis dan kemudian melakukan tindakan yang sesuai.
jepit

Jawaban:

10

Ini pada dasarnya adalah jawaban Warwick, hanya dengan instruksi langkah demi langkah.


  1. Buat skrip shell berikut di folder rumah Anda:

    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. Ubah izin agar dapat dieksekusi

    $ chmod +x check_inet.sh
    
  3. Edit /etc/crontabmenggunakan sudodan tambahkan baris berikut (ganti yournamedengan nama pengguna Anda yang sebenarnya):

    */30 * * * * /home/yourname/check_inet.sh
    
hololeap
sumber
5

Salah satu caranya adalah dengan meletakkan entri di cron root yang menjalankan skrip setiap 30 menit. Script akan menguji koneksi WIFI, mungkin menggunakan ping, dan menulis hasilnya ke file di / tmp - 1 untuk koneksi ada, 0 jika tidak. Iterasi skrip selanjutnya akan memeriksa file itu, dan jika 0, dan koneksi WIFI masih buruk, jalankan init 6perintah.

Warwick
sumber
3

Saya pikir solusi hololeap bekerja.

Solusi saya memeriksa setiap N menit (tergantung pada bagaimana Anda mengkonfigurasi crontab Anda) untuk koneksi jaringan yang berfungsi. Jika cek gagal saya tetap melacak kegagalan. Ketika jumlah kegagalan> 5 saya mencoba untuk me-restart wifi (Anda juga dapat me-reboot Raspberry jika wifi restart gagal, periksa komentar).

Berikut ini repo GitHub yang selalu berisi versi terbaru dari skrip: https://github.com/ltpitt/bash-network-repair-automation

Di sini, sesuai dengan kebijakan umum stackexchange (semua jawaban tidak boleh hanya berisi tautan), juga file network_check.sh, salin dan tempel ke folder apa pun yang Anda suka, instal petunjuk ada di komentar skrip.

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

sunting 1/26/2018: Saya telah menghapus file temp untuk membiarkan skrip berjalan dalam memori dan menghindari penulisan pada kartu SD Raspberry.

Pitto
sumber
1
Script ini menghindari restart pada pemutusan sementara. Luar biasa terima kasih!
wezzix
1
Tampaknya Anda telah membuat perubahan besar dalam skrip ini. Seperti yang saya pahami, versi sebelumnya akan lulus, melakukan hal-hal (termasuk memperbarui file tmp), dan keluar. Itu tidak mengandung loop; melainkan tergantung pada cron untuk menjalankannya setiap lima menit. Jika jaringan mati selama lima pemeriksaan berturut-turut (yaitu, untuk rentang sekitar setengah jam), skrip akan melakukan hal-hal untuk mencoba mengatur ulang jaringan. Ini tampaknya menjadi jawaban yang baik untuk pertanyaan itu, meskipun fakta bahwa itu menulis ke file tmp sedikit kelemahan. … (Lanjutan)
Scott
(Lanjutan) ... Versi baru berisi loop, dan memeriksa jaringan setiap lima detik . Jika jaringan mati selama lima pemeriksaan berturut-turut (yaitu, untuk rentang sekitar setengah menit ), skrip melakukan hal-hal untuk mencoba mengatur ulang jaringan. (Ini tampaknya berbeda dari apa yang ditanyakan oleh pertanyaan itu.) Dan ini sedikit aneh. Setelah mendeteksi kegagalan jaringan lima kali berturut-turut dan mengatur ulang jaringan, skrip keluar. (Dan, kebetulan, itu keluar tanpa pernah memeriksa apakah jaringan itu benar-benar muncul kembali.) ... (Lanjutan)
Scott
(Lanjutkan) ... Tapi, selama jaringan menyala, skrip tetap berjalan selamanya, menunggu jaringan gagal. Sementara itu, cron terus memulai ulang skrip setiap lima menit. Jika jaringan bertahan selama satu jam, akan ada selusin salinan skrip berjalan. Dan, jika jaringan gagal maka, selusin proses akan saling bertarung, melakukan secara tidak sinkron ifdowndan ifup, mungkin memperbaiki jaringan, dan mungkin tidak. ... ... ... ... ... ... ... "..." ... "..." ... "..." ... "" ... "" ... "" Jika saya salah paham, tolong jelaskan kepada saya. … (Lanjutan)
Scott
(Lanjutkan) ... (1) Jika Anda akan membuat desain ulang besar dari jawaban yang telah diposting selama lebih dari setahun, Anda harus mengatakan apa yang telah Anda lakukan. "Saya telah menghapus file temp untuk menjalankan skrip di memori" bukan deskripsi yang memadai tentang perubahan Anda. (2) Sepertinya Anda memiliki koleksi pasak persegi, pasak bundar, lubang persegi, dan lubang bundar, dan Anda belum memasangnya dengan tepat. Anda harus memodifikasi skrip untuk keluar ketika melihat bahwa jaringan sudah aktif, atau memodifikasinya untuk berjalan selamanya, dan mengubah crontab untuk memulai skrip hanya sekali (yaitu, pada saat boot).
Scott
0

Saya memodifikasi skrip Pitto untuk gateway multitech mtac loraWAN saya (tidak ada masalah). Saya juga menambahkan file log.

#!/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
pengguna3036425
sumber
(1) Mengapa Anda masih membicarakannya ifupdownjika Anda tidak menggunakannya? (2) Mengapa Anda berubah gateway_ipdari variabel ke konstanta hard-coded?
Scott
hai scott, saya lupa untuk menghapus komentar ifup ifdown. Saya lupa mengubah gatewy_ip hardcoded.
user3036425
Bagus! Saya telah menambahkan versi baru yang tidak menggunakan file temp (menulis di Raspberry's SD bukan ide yang bagus), Anda dapat memeriksanya dalam jawaban saya.
Pitto
Skrip ini mewarisi beberapa masalah yang ada dalam versi asli skrip Pitto (yang kemudian diperbaiki): (1) Jika jaringan mati mulai pukul 00:00:01 (satu detik setelah tengah malam), skrip tidak akan bereaksi hingga 00:35 (yaitu, 35 menit kemudian, pada pemeriksaan ketujuh), karena, meskipun nilai bertambah dalam network_check_tries_filefile (ketika pinggagal), itu tidak menambah network_check_triesvariabel. … (Lanjutan)
Scott
(Lanjutkan) ... Jadi skrip berjalan tujuh kali (pukul 00:05, 00:10, 00:15, 00:20, 00:25, 00:30, dan 00:35) dengan nilai network_check_triessama dengan 0, 1, 2, 3, 4, 5, dan 6 - dan hanya pada permohonan ketujuh ( network_check_triessama dengan 6) if [ "$network_check_tries" -gt 5 ]tes berhasil. Bisa dibilang, ini adalah perilaku yang benar. Sejauh yang diketahui skrip, jaringan mungkin sudah mati di 00:04:59, jadi butuh tujuh kegagalan berturut-turut untuk memastikan Anda telah menempuh periode 30 menit. … (Lanjutan)
Scott