Skip to content

利用排程工作(Cron job)來自動重啟掉線的路由器

本人居住於唐樓,很早以前便開始使用SIM卡上網取代昂貴8M網上爬。以前一直是使用Asus RT-AC51U加上華為E3372H-153的LTE Dongle來上網的,後來為了更高速的網速體驗,更換了Asus 4G-AC53U直接插SIM卡免煩方案。這樣可以把原先 LTE Dongle + Router的理論上限速度從100Mbps提高到300Mbps。

除了更換了上述方案外,我還更換了網絡供應商 (ISP),速度比以往提升了10多20Mbps。雖然速度提升了不少,但卻常常遇到斷線的問題,尤其繁忙時間更甚。(OS: 可能是這個ISP知道我是用作家居寬頻使用然後故意把我斷線) 斷線後前往路由器主頁觀看,狀態都是“連線中斷”、“沒有偵測到SIM卡”、“您ISP提供的DHCP功能發生錯誤”等等。

遇到以上問題, 正常來說直接等待Router再次連上SIM卡就好 ,但我卻發現我的Asus 4G-AC53U並不會自己重連,而是一直保持斷線狀態。經過Google幫助後,還是搞不清楚道是路由器的問題還是ISP的問題。最後只能亡羊補牢,嘗試設置斷線後自動重新連接,不用每次都手動重啟路由器。

在某個關於 Asuswrt-Merlin 的外國論壇上看到了Asus路由器的某些4G模組相關指令,嘗試自行編寫shell script來重啟interface,但無奈不是每次斷線都能重啟interface就能解決,還有其他原因會導致斷線。把心一橫,不行就直接重啟路由器算了。以下shell script是watchdog script的一種,監視著router如果不能連接google的話就會嘗試重啟interface,如果重啟之後10秒後依然不能連接到google的話就會重啟路由器。

#!/bin/sh
boottime=$(cat /proc/uptime | awk '{ print $1 }')
newboot=${boottime%.*}

if [[ $newboot -ge 300 ]] ; then
  echo "Up time is greater than 5 mins..."
  if ! ping -w 10 -c 10 www.google.com > /dev/null ; then
    echo "No responds from google, restarting usb0 interface..."
    ifconfig usb0 down
    sleep 10
    ifconfig usb0 up
    sleep 10
    if ! ping -w 10 -c 10 www.google.com > /dev/null ; then
      echo "No responds from google AGAIN!!! Rebooting..."
      date >> /jffs/reboot-log                #log reboot time
      reboot
    else
      echo "Resume Okay, no reboot required."
    fi
  else
    echo "System healthy, exiting..."
    exit 1
  fi
else
  echo "Up time is less than 5 mins, exiting..."
  exit 1
fi

我們暫時把以上shell script儲存為 /jffs/watchdog.sh。既然要從背後一直監視著路由器,就一定要把以上shell script使用Cronjob來定時執行吧。Asus路由器也是一個小小的linux系統,裡面有cron daemon,但它並沒有一個管理工具crontab來讓你輕易的管理cron job。因此我們需要手動在 /var/spool/cron/crontabs/<admin名稱> 添加上自己的cron jobs

例如:我的管理員用戶名稱是admin,我就要把新增以下代碼到 /var/spool/cron/crontabs/admin 裡面來計劃每5分鐘執行一次watchdog.sh:

# cron jobs to import into admin's crontab
*/5 * * * * /jffs/watchdog.sh

當你認為所有代碼都準備好的時候,那就大錯特錯了。 因為 /var目錄原來是儲存於一個隨機存取記憶體之中,所以每次重啟路由器的時候,上面那個crontab的代碼便會被刪除。 而儲存 watchdog.sh的儲存位置 /jffs,是一個Asuswrt提供給我們一個小小的儲存空間,不會在重啟路由器的時候刪除的,這正好可以拿來儲存我們的script。 幸好,正所謂上帝關了一扇門必定會再為你打開另一扇窗,Asuswrt有一個隱藏的功能,讓你可以在路由器載入USB drive的時候執行一些代碼,我們可以藉此代碼用來把預先儲存在 /jffs/admin複製到 /var/spool/cron/crontabs/裡面。這樣就可以成功匯入cron job設定檔又不怕路由器重啟刪掉了檔案了。 輸入以下代碼並儲存在 /jffs/copyscript:

cp /jffs/admin /var/spool/cron/crontabs

要注意的是admin是我這邊的登入名稱,如果你的跟我的不一樣,請記得修改喔。另外,為了確保以上檔案能被成功執行,請把 /jffs/copyscript的檔案設定為權限755。

chmod 755 /jffs/copyscript

上面提及過Asuswrt提供了一個隱藏的功能讓我們在載入USB drive的時候執行一個shell script, 接下來我們就要輸入以下代碼來開啟這個功能:

nvram set script_usbmount="/jffs/copyscript" 
nvram commit

這樣便是真正的大功告成囉。最後你還可以到 /jffs/reboot-log查看每次重啟路由器的時間,希望可以從中了解掉線的問題是因為路由器本身,還是ISP的陰謀。。。

Published inLinuxRouter

Be First to Comment

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *