2009年6月28日

FreeBSD MPD PPPoE斷線檢查Script

家裡是用中華電信FTTB的VDSL,設定實際上就是PPPoE的設定,而我使用FreeBSD+pf+mpd當NAT。

雖然中華電信大部分情況下都滿穩的,不大會斷線(可能VDSL過熱、機房改設定...等原因吧),但有時候就是會不知道什麼原因斷線,mpd上關於重新連線的設定雖然有加,但似乎沒啥效果,斷線後就是沒IP不會重新連線。

這次又發生了這樣的情況,為瞭解決這樣的問題,寫了個超簡單斷線檢查Script,在發生PPPoE斷線時自動把電腦重新開機。

#!/bin/tcsh

if(== `/sbin/ifconfig | /usr/bin/sed '/-->/\\!d' | /usr/bin/awk '{ print $2 }'`) then
/sbin/reboot
endif


程式碼超級簡單,當執行它之後,它會執行

/sbin/ifconfig | /usr/bin/sed '/-->/\!d' | /usr/bin/awk '{ print $2 }'


也就是執行ifconfig,然後找「-->」,找到後把第二個字串取出(PPPoE取得的IP),如果找不到,顯然就是PPPoE斷線了。
接著透過 tcsh 的 if 判斷式,判斷上述指令「找不到時」,就執行裡面的指令

/sbin/reboot


完成後改好權限,把它放入/etc/crontab中

*/30 * * * * root /usr/local/bin/disconnect-check.sh


如此一來,每30分鐘它都會執行一次,看看PPPoE有沒有秀斗,如果秀斗了,就把電腦重開。

我有測試過,應該是能夠work的。

2013-08-30更新
程式更新如下
#!/bin/tcsh

if( ! -e /var/log/disconnect-reboot.log ) then
  touch /var/log/disconnect-reboot.log
endif

if(== `/sbin/ifconfig ng0`) then
  echo `date +%Y-%m-%d\ %H:%M:%S` reboot >> /var/log/disconnect-reboot.log
  reboot
else
  if(== `/sbin/ifconfig ng0 | /usr/bin/sed '/-->/\\!d'`) then
  echo `date +%Y-%m-%d\ %H:%M:%S` mpd restart >> /var/log/disconnect-reboot.log
  /usr/local/etc/rc.d/mpd5 restart
  endif
endif

新增與修改:
1. 檢查log檔案是否存在,不存在則建立
2. 如果裝置ng0不存在,重新開機(異常情況)
3. 如果裝置ng0存在,但沒有IP,將mpd重新啟動(通常的斷線情況)

3 則留言:

jz 提到...

用 monit 來監控也蠻方便的,它本身可以設定些判斷邏輯(ex:ping 不出去, 某個port 沒開), 條件成立的話可以執行其他程式 .. ^^ 只是 daemon 還是會佔些記憶體啦 ..

Cody 提到...

長知識了~
謝謝您的介紹,我會拿來玩玩看的,好用可以換上去用,或者用在其它地方(我看它可以監控的東西很多)。

DR 提到...

感謝分享

不過
reboot會不會太殺?
網路不穩不就30分鐘重開一遍
killall ppp;ppp -ddial my_profile_name就好啦

只檢查IP存不存在好像也有點草率
我遇過幾次IP還在卻無法連線的
可能要多判斷一些條件吧