Belirli bir süre için wifi bağlantısı yoksa otomatik olarak yeniden başlat


14

Raspberry Pi sunucum rastgele bir süre sonra wifi bağlantısını kaybediyor ve bir şekilde otomatik olarak kurtulamıyor gibi görünüyor.

Genellikle elle yapılan bir yeniden başlatma sorunu çözer.

Yaklaşık 30 dakika sonra hiçbir wifi yoksa otomatik olarak yeniden başlatmak istiyorum. Bunu nasıl yapabilirim?


5
Arayüzü kaldırmayı ve geri getirmeyi denediniz mi? Kablosuz kartınız için çekirdek modülünü boşaltmaya ve yeniden yüklemeye ne dersiniz? Kartı yeniden başlatmadan sıfırlamak için yapabileceğiniz başka bir şey olabilir.
hololeap

1
evet bu da işe yarayacaktır, ancak buradaki ana sorun bunu otomatik olarak nasıl algılayacağımız ve sonra uygun eylemi nasıl yapacağınızdır.
kelepçe

Yanıtlar:


12

Bu aslında Warwick'in cevabıdır, sadece adım adım talimatlarla.


  1. Ana klasörünüzde aşağıdaki kabuk komut dosyasını oluşturun:

    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. İzinleri yürütülebilir olması için değiştirin

    $ chmod +x check_inet.sh
    
  3. Düzenleme /etc/crontabkullanarak sudove (replace aşağıdaki satırı ekleyin yournamegerçek kullanıcı adına sahip):

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

5

Bunun bir yolu, her 30 dakikada bir komut dosyası çalıştıran root'un cronuna bir giriş koymak olabilir. Betik, belki de kullanarak WIFI bağlantısını test eder pingve sonucu bağlantı için / tmp - 1 içindeki bir dosyaya yazar, yoksa 0. Daha sonra komut dosyasının yinelemeleri bu dosyayı kontrol eder ve 0 ise ve WIFI bağlantısı hala kötüyse, bir init 6komut çalıştırın .


3

Bence hololeap çözümü çalışıyor.

Çözümüm, çalışan bir ağ bağlantısı için her N dakikada bir (crontab'ınızı nasıl yapılandırdığınıza bağlı olarak) denetler. Kontrol başarısız olursa hatayı takip ederim. Hata sayısı> 5 olduğunda, wifi'yi yeniden başlatmayı deniyorum (wifi yeniden başlatma başarısız olursa Ahududu da yeniden başlatabilirsiniz, yorumları kontrol edin).

Her zaman komut dosyasının en son sürümünü içeren bir GitHub repo'su: https://github.com/ltpitt/bash-network-repair-automation

İşte, stackexchange genel politikasına göre (tüm yanıtlar sadece bağlantılar içermemelidir), ayrıca network_check.sh dosyasını da kopyalayıp istediğiniz herhangi bir klasöre yapıştırın, yükleme talimatları komut dosyasının yorumlarındadır.

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

edit 1/26/2018: Komut dosyasının bellekte çalışmasına izin vermek ve Ahududu SD kartına yazmaktan kaçınmak için geçici dosyaları kaldırdım.


1
Bu komut dosyası, geçici bağlantı kesilmelerinde yeniden başlatmayı önler. Mükemmel, teşekkürler!
wezzix

1
Bu senaryoda büyük bir değişiklik yapmış görünüyorsunuz. Anladığım kadarıyla, önceki sürüm bir geçiş yapar, (tmp dosyalarını güncelleme dahil) bir şeyler yapar ve çıkar. Herhangi bir ilmek içermiyordu; daha ziyade, her beş dakikada bir çalıştırmak için cron'a bağlıydı. Ağ art arda beş kontrol (örneğin, yaklaşık yarım saatlik bir süre) boyunca kapalı kalırsa, komut dosyası ağı sıfırlamayı denemek için bazı şeyler yapar. Tmp dosyalarına yazdığı gerçeği biraz dezavantaj olmasına rağmen, bu soruya iyi bir cevap gibi görünüyordu. … (Devamı)
Scott

(Devamı)… Yeni sürüm bir döngü içeriyor ve ağı beş saniyede bir kontrol ediyor . Ağ art arda beş kontrol için kapalı kalırsa (yani, yaklaşık yarım dakikalık bir süre için ), komut dosyası ağı sıfırlamaya çalışmak için bir şeyler yapar. (Bu, sorunun sorduğundan farklı gibi görünüyor.) Ve burada biraz garipleşiyor. Art arda beş kez ağ hatası algılayıp ağı sıfırladıktan sonra komut dosyası çıkar. (Ve, bu arada, ağın gerçekten geri gelip gelmediğini hiç kontrol etmeden çıkar.)… (Devam)
Scott

(Devam)… Ancak, ağ açık olduğu sürece komut dosyası sonsuza kadar çalışmaya devam eder ve ağın başarısız olmasını bekler. Bu arada, cron senaryoyu beş dakikada bir yeniden başlatır. Ağ bir saat boyunca kalırsa, çalışan komut dosyasının bir düzine kopyası olacaktır. Ve eğer ağ başarısız olursa , bu düzinelerce süreç eşzamansız olarak yapıyor ifdownve ifupbelki de ağı düzeltiyor ve belki de yapmıyor. …………………………………………………………………………………… Bir şeyi yanlış anladıysam, lütfen bana açıklayın. … (Devamı)
Scott

(Devamı)… (1) Bir yıldan uzun süredir gönderilen bir cevabın bu kadar büyük bir yeniden tasarımını yapacaksanız, ne yaptığınızı söylemelisiniz. “Komut dosyasının bellekte çalışmasına izin vermek için geçici dosyaları kaldırdım” değişikliklerinizin yeterli bir açıklaması değil. (2) Görünüşe göre bir kare mandal, yuvarlak mandal, kare delik ve yuvarlak delik koleksiyonunuz var ve onları doğru eşleştirmediniz. Komut dosyasını ağın açık olduğunu gördüğünde çıkmak için değiştirmeli veya sonsuza kadar çalışacak şekilde değiştirmeli ve komut dosyasını yalnızca bir kez (yani önyükleme zamanında) başlatacak şekilde değiştirmelisiniz.
Scott

0

Pitto'nun senaryosunu multitech mtac loraWAN ağ geçidim için değiştirdim (fping yok). Ayrıca bir günlük dosyası ekledim.

#!/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) ifupdownEğer kullanmıyorsanız neden hala konuşuyorsunuz ? (2) gateway_ipBir değişkenden neden sabit kodlanmış bir sabite geçtiniz?
Scott

merhaba scott, ifup ifdown yorumları silmeyi unuttum. Sabit kodlu gatewy_ip dosyasını değiştirmeyi unuttum.
user3036425

Güzel! Geçici dosyaları kullanmayan yeni bir sürüm ekledim (Raspberry SD'sinde yazmak çok iyi bir fikir değildi), cevabımda kontrol edebilirsiniz.
Pitto

Bu komut dosyası, Pitto komut dosyasının orijinal sürümündeki (daha sonra düzeltilen) birkaç sorunu devralır: (1) Ağ 00:00:01 (gece yarısından bir saniye sonra) kapalı ise, komut dosyası 00:35'e kadar (yani, yedinci kontrolde 35 dakika sonra) tepki verin, çünkü network_check_tries_filedosyadaki değeri artırsa bile ( pingbaşarısız olduğunda) network_check_triesdeğişkeni arttırmaz . … (Devamı)
Scott

(Devam)… Yani senaryo yedi kez (00:05, 00:10, 00:15, 00:20, 00:25, 00:30 ve 00:35) network_check_tries0, 1'e eşit olarak çalışır, 2, 3, 4, 5 ve 6 - ve testin başarılı network_check_triesolduğu sadece yedinci çağırmada ( 6'ya eşit) if [ "$network_check_tries" -gt 5 ]. Muhtemelen, bu doğru davranıştır. Komut dosyasının bildiği kadarıyla, ağ 00:04:59'da kapanmış olabilir, bu nedenle 30 dakikalık bir süreyi kapsadığınızdan emin olmak için art arda yedi başarısızlık gerekir. … (Devamı)
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.