Tự động khởi động lại, nếu không có kết nối wifi trong một thời gian nhất định


13

Có vẻ như máy chủ Raspberry Pi của tôi mất kết nối wifi sau một thời gian ngẫu nhiên và bằng cách nào đó không thể tự động phục hồi.

Thông thường, một khởi động lại được thực hiện bằng tay giải quyết vấn đề.

Tôi muốn làm cho nó tự động khởi động lại nếu không có wifi sau khoảng 30 phút. Làm thế nào tôi có thể làm điều đó?


5
Bạn đã thử gỡ giao diện xuống và đưa nó trở lại chưa? Làm thế nào về việc dỡ và tải lại mô-đun hạt nhân cho thẻ không dây của bạn? Có thể có một số thứ khác bạn có thể làm để đặt lại thẻ mà không cần khởi động lại.
hololeap

1
Vâng, điều này có thể cũng sẽ hoạt động, nhưng vấn đề chính ở đây là làm thế nào để tự động phát hiện điều này và sau đó thực hiện hành động thích hợp.
kẹp

Câu trả lời:


10

Đây thực chất là câu trả lời của Warwick, chỉ với các hướng dẫn từng bước.


  1. Tạo tập lệnh shell sau trong thư mục nhà của bạn:

    kiểm tra_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. Thay đổi các quyền để nó có thể thực thi được

    $ chmod +x check_inet.sh
    
  3. Chỉnh sửa /etc/crontabbằng cách sử dụng sudovà thêm dòng sau (thay thế yournamebằng tên người dùng thực tế của bạn):

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

5

Một cách sẽ là đặt một mục trong cron gốc chạy kịch bản cứ sau 30 phút. Tập lệnh sẽ kiểm tra kết nối WIFI, có thể sử dụng pingvà ghi kết quả vào một tệp trong / tmp - 1 để tồn tại kết nối, 0 nếu không. Các lần lặp tiếp theo của tập lệnh sau đó sẽ kiểm tra tệp đó và nếu nó là 0 và kết nối WIFI vẫn còn tệ, hãy chạy một init 6lệnh.


3

Tôi nghĩ rằng giải pháp hololeap đang hoạt động.

Giải pháp của tôi kiểm tra mỗi N phút (tùy thuộc vào cách bạn định cấu hình crontab) cho kết nối mạng hoạt động. Nếu kiểm tra thất bại tôi theo dõi các thất bại. Khi số lần thất bại> 5 Tôi cố gắng khởi động lại wifi (bạn cũng có thể khởi động lại Raspberry nếu khởi động lại wifi thất bại, kiểm tra các bình luận).

Đây là repo GitHub luôn chứa phiên bản mới nhất của tập lệnh: https://github.com/ltpitt/bash-network-repair-automation

Đây là, theo chính sách chung của stackexchange (tất cả các câu trả lời không nên chỉ chứa các liên kết), cũng như tệp network_check.sh, sao chép và dán nó vào bất kỳ thư mục nào bạn thích, hướng dẫn cài đặt đều nằm trong phần bình luận của tập lệnh.

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

chỉnh sửa 1/26/2018: Tôi đã xóa các tệp tạm thời để cho phép tập lệnh chạy trong bộ nhớ và tránh ghi vào thẻ SD của Raspberry.


1
Kịch bản này tránh khởi động lại khi ngắt kết nối tạm thời. Cảm ơn vô cùng!
wezzix

1
Bạn dường như đã thực hiện một thay đổi lớn trong kịch bản này. Theo tôi hiểu, phiên bản trước sẽ thực hiện một lần, thực hiện công việc (bao gồm cập nhật tệp tmp) và thoát. Nó không chứa bất kỳ vòng lặp nào; thay vào đó, nó phụ thuộc vào cron để chạy nó cứ sau năm phút. Nếu mạng ngừng hoạt động trong năm lần kiểm tra liên tiếp (nghĩa là trong khoảng nửa giờ), tập lệnh sẽ thực hiện mọi việc để cố gắng đặt lại mạng. Đây dường như là một câu trả lời tốt cho câu hỏi, mặc dù thực tế là nó được ghi vào các tệp tmp là một nhược điểm. Tiết (Cont'd)
Scott

(Tiếp theo) Phiên bản mới chứa một vòng lặp và kiểm tra mạng cứ sau năm giây . Nếu mạng ngừng hoạt động trong năm lần kiểm tra liên tiếp (nghĩa là trong khoảng nửa phút ), tập lệnh sẽ thực hiện mọi việc để cố gắng đặt lại mạng. (Điều này có vẻ khác với những gì câu hỏi yêu cầu.) Và ở đây nó có một chút kỳ lạ. Sau khi phát hiện lỗi mạng năm lần liên tiếp và đặt lại mạng, tập lệnh sẽ thoát. (Và, tình cờ, nó thoát ra mà không bao giờ kiểm tra xem mạng có thực sự hoạt động trở lại hay không.) Re (Cont'd)
Scott

(Tiếp), nhưng, miễn là mạng hoạt động, tập lệnh cứ chạy mãi, chờ mạng không hoạt động. Trong khi đó, cron cứ khởi động lại kịch bản cứ sau năm phút. Nếu mạng duy trì trong một giờ, sẽ có hàng tá bản sao của tập lệnh đang chạy. Và, nếu mạng thất bại thì hàng tá các quá trình đó sẽ chiến đấu với nhau, thực hiện không đồng bộ ifdownifup, có thể sửa mạng và có thể không. Mạnh mẽ và đáng tin cậy khi bạn gặp rắc rối, hãy giải thích và giải quyết vấn đề này. Tiết (Cont'd)
Scott

(Tiếp theo) Nhiều (1) Nếu bạn định thiết kế lại một câu trả lời lớn như vậy đã được đăng trong hơn một năm, bạn nên nói những gì bạn đã làm. Tôi đã xóa các tệp tạm thời để cho phép tập lệnh chạy trong bộ nhớ. Đây không phải là một mô tả đầy đủ về các thay đổi của bạn. (2) Dường như bạn có một bộ sưu tập các chốt vuông, chốt tròn, lỗ vuông và lỗ tròn và bạn chưa nhận được chúng khớp đúng. Bạn nên sửa đổi tập lệnh để thoát khi thấy mạng hoạt động hoặc sửa đổi tập lệnh để chạy mãi mãi và thay đổi crontab để chỉ khởi động tập lệnh một lần (nghĩa là tại thời điểm khởi động).
Scott

0

Tôi đã điều chỉnh kịch bản của Pitto cho cổng mtac loraWAN của tôi (không có fping). Tôi cũng đã thêm một tệp nhật ký.

#!/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) Tại sao bạn vẫn nói về ifupdownnếu bạn không sử dụng nó / họ? (2) Tại sao bạn thay đổi gateway_iptừ một biến thành một hằng số được mã hóa cứng?
Scott

chào scott, tôi quên không xóa bình luận ifup ifdown. Tôi quên thay đổi gatewy_ip được mã hóa cứng.
dùng3036425

Đẹp! Tôi đã thêm một phiên bản mới không sử dụng tệp tạm thời (viết trên SD của Raspberry không phải là một ý tưởng tuyệt vời), bạn có thể kiểm tra nó trong câu trả lời của tôi.
Pitto

Tập lệnh này thừa hưởng một số vấn đề trong phiên bản gốc của tập lệnh Pitto (sau đó đã được sửa): (1) Nếu mạng ngừng hoạt động lúc 00:00:01 (một giây sau nửa đêm), tập lệnh sẽ không phản ứng cho đến 00:35 (tức là 35 phút sau, trong lần kiểm tra thứ bảy), bởi vì, mặc dù nó tăng giá trị trong network_check_tries_filetệp (khi pingthất bại), nó không làm tăng network_check_triesbiến. Tiết (Cont'd)
Scott

(Tiếp), Vì vậy, tập lệnh chạy bảy lần (lúc 00:05, 00:10, 00:15, 00:20, 00:25, 00:30 và 00:35) network_check_triesbằng 0, 1, 2, 3, 4, 5 và 6 - và chỉ đến lần gọi thứ bảy ( network_check_triesbằng 6) thì if [ "$network_check_tries" -gt 5 ]thử nghiệm thành công. Có thể cho rằng, đây là hành vi chính xác. Theo như kịch bản biết, mạng có thể đã ngừng hoạt động vào lúc 00:04:59, do đó, phải mất bảy lần thất bại liên tiếp để chắc chắn rằng bạn đã bảo hiểm trong khoảng thời gian 30 phút. Tiết (Cont'd)
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.