如何在网络故障时定时重启 Linux 主机?

hua*_*ngw 2 networking cron

我有一个个人Ubuntu主机,连接到公共/共享 Wi-Fi AP(不受我控制)。

有时,会出现网络问题,我很确定,仅重新启动网络服务是行不通的。唯一的办法就是重启它。

我的计划是添加一个 crontab,来测试网络连接。如果失败,请重新启动计算机。

如果我手动运行 auto_reboot.sh,当ping测试失败时,它会重新启动。但是从 crontab 运行,它不起作用:)

这是我的 crontab 条目

crontab -l
* * * * * /root/loadrc/transmissionrc/auto_reboot.sh
Run Code Online (Sandbox Code Playgroud)

文件/root/loadrc/transmissionrc/auto_reboot.sh

#!/bin/zsh

/root/loadrc/networkrc/ping.sh
rc=$?

if [[ $rc -eq 0 ]]
then
    echo "say The internet is back up."
else
    reboot
fi
Run Code Online (Sandbox Code Playgroud)

文件/root/loadrc/networkrc/ping.sh

#!/bin/zsh
((count = 10))                           # Maximum number to try.

while [[ $count -ne 0 ]] ; do
    ping -c 1 8.8.8.8                    # Try once.
    rc=$?
    if [[ $rc -eq 0 ]] ; then
        ((count = 1))                    # If okay, flag loop exit.
    else
        sleep 1                          # Minimise network storm.
    fi
    ((count = count - 1))                # So we don't go forever.
done

exit $rc
Run Code Online (Sandbox Code Playgroud)

我添加了一些日志,并故意关闭 Wi-Fi 接口:

watch ifconfig wlan0 down
Run Code Online (Sandbox Code Playgroud)
transmissionrc/auto_reboot.sh
#!/bin/zsh

echo "" > /root/loadrc/crontab.log

/root/loadrc/networkrc/ping.sh
rc=$?

if [[ $rc -eq 0 ]]
then
    echo "say The internet is back up."
else
    reboot
fi
Run Code Online (Sandbox Code Playgroud)
networkrc/ping.sh
#!/bin/zsh
((count = 10))                           # Maximum number to try.


while [[ $count -ne 0 ]] ; do
    /usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1
    echo "step --> 2" >> /root/loadrc/crontab.log
    rc=$?

    if [[ $rc -eq 0 ]] ; then
        echo "step --> 3" >> /root/loadrc/crontab.log
        ((count = 1))                    # If okay, flag loop exit.
    else
        echo "step --> 4" >> /root/loadrc/crontab.log
        sleep 1                          # Minimise network storm.
    fi
    ((count = count - 1))                # So we don't go forever.
done

exit $rc
Run Code Online (Sandbox Code Playgroud)

文件/root/loadrc/crontab.log

/usr/bin/ping: connect: Network is unreachable
step --> 2
step --> 3
Run Code Online (Sandbox Code Playgroud)

这意味着,在 crontab 模式下,即使 ping 测试失败,返回码仍然为零。

那么问题来了:如何在crontab模式下测试网络连接呢?

Bob*_*Bob 7

/usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1 
echo "step --> 2" >> /root/loadrc/crontab.log  
rc=$?
Run Code Online (Sandbox Code Playgroud)

我认为这会检查命令的退出代码echo,而您的逻辑需要命令的退出代码ping