openwrt 有些韌體不太穩定,會時不時的斷網,導致家裡無法上網,遇到這種情況只能手動重啟openwrt裝置,該操作不方便,作為一個極客愛好者,那肯定是要實現自動化處理的了,寫一個簡單的指令碼加入到crontab
定時任務中,就可完全自動化檢測了,解放雙手。
1、ping
指定域名5次,只要要有2次以上的包響應,才表示網路暢通
2、如果低於2次,則視為網路不通,重啟網路,並等待20秒
3、再次檢測網路如果還是網路不通的話,則重啟openwrt服務
4、當連續失敗計數大道10次以上,則重啟次數改為10分鐘,重複上述步驟,當網路暢通後,計數歸零
#!/bin/bash
# ping的域名
DOMAIN=baidu.com
# 連續計數
NETWORK_CHECK_COUNTER_FILE="/data/shell/log/network-check-counter.log"
# 執行紀錄檔
NETWORK_CHECK_LOG_FILE="/data/shell/log/network-check.log"
# 預設計數為0
COUNTER=0
# 連續失敗計數大於該數值,則進行 RESTART_INTERVAL 秒等待,再執行重新檢測
COUNTER_THRESHOLD=10
# 持續失敗,後預設等待時間(秒),然後再重啟
RESTART_INTERVAL=600
# 檢查檔案是否存在,如果不存在則建立檔案
touch $NETWORK_CHECK_LOG_FILE
if [ ! -e $NETWORK_CHECK_COUNTER_FILE ]; then
touch $NETWORK_CHECK_COUNTER_FILE
echo "0" >$NETWORK_CHECK_COUNTER_FILE
fi
COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)
# 檢測網路連線函數
function check_network {
# 如果ping 5次至少有2次包未響應,則執行一下程式碼
if ! ping -c 5 $DOMAIN > /dev/null 2>&1; then
# 如果無法連線網路,則重啟網路
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線失敗"
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線失敗" >>$NETWORK_CHECK_LOG_FILE
/etc/init.d/network restart
sleep 20
if ! ping -c 5 $DOMAIN > /dev/null 2>&1; then
# 如果仍無法連線網路,則重啟OpenWrt服務
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線仍然失敗,重啟OpenWrt服務"
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線仍然失敗,重啟OpenWrt服務" >>$NETWORK_CHECK_LOG_FILE
/etc/init.d/openwrt-service restart
echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服務已重啟"
echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服務已重啟" >>$NETWORK_CHECK_LOG_FILE
echo $(($(cat $NETWORK_CHECK_COUNTER_FILE) + 1)) >$NETWORK_CHECK_COUNTER_FILE
else
echo "$(date '+%Y-%m-%d %H:%M:%S') 重啟網路網路後,連線已恢復"
echo "$(date '+%Y-%m-%d %H:%M:%S') 重啟網路網路後,連線已恢復" >>$NETWORK_CHECK_LOG_FILE
echo "0" >$NETWORK_CHECK_COUNTER_FILE
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線正常"
if [ $(cat $NETWORK_CHECK_COUNTER_FILE) -ge 1 ]; then
# 如果網路暢通且之前有失敗計數,則進行POST請求
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線已恢復,傳送POST請求"
echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線已恢復,傳送POST請求" >>$NETWORK_CHECK_LOG_FILE
# 使用curl傳送POST請求到 http://aaa.com
# curl -X POST http://baidu.com
fi
echo "0" >$NETWORK_CHECK_COUNTER_FILE
fi
}
# 計數器檢查函數
function check_counter {
COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)
if [[ $COUNTER -ge $COUNTER_THRESHOLD ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 計數器值大於等於 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒後重新檢測網路連線"
echo "$(date '+%Y-%m-%d %H:%M:%S') 計數器值大於等於 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒後重新檢測網路連線" >>$NETWORK_CHECK_LOG_FILE
sleep $RESTART_INTERVAL # 等待
check_network
else
check_network
fi
}
check_counter
echo "$(date '+%Y-%m-%d %H:%M:%S') network 檢查完畢"
1、將該指令碼放在openwrt
任意一個目錄,我這裡是放在 /data/shell/
目錄下
2、新增執行許可權 chomd +x ./network-check.sh
3、執行crontab -e
在crontab
中追加一行 */2 * * * * /data/shell/network-check.sh
2分鐘執行一次檢測
4、新增完成後,我們在openwrt
後臺的計劃任務
列表裡面就可以看到了,也可以直接通過計劃任務列表去新增