最近公司的项目开发,用到了VPN,用自己的VPN服务器存放数据,作为搞移植的我也是从零开始要搞定VPN的移植以及实现全过程,其中移植都搞定了,现在记录下板子当遇到外界因素而要实现自动重启,我采用的方法,望前辈们多多指教,勿喷:
板子:i.MX28 freescale
Linux系统:2.6.35.3
xl2tpd移植版本:1.3.10
pppd移植版本:2.4.7
当遇到断网等因素,导致pppd进程最终后,VPN就属于真正的死了,日志信息如下:
我发现在没有其他拯救措施情况下,只能手动重启,于是想写一个脚本来完成自动重连,上图中20点以前是pppd由于网断开,pppd最终自动终止;20点后的循环是脚本自动重连的效果,先上代码:
#! /bin/sh
while true
pppdNum=`ps -e | grep 'pppd' | wc -l`
do echo "pppdNum = $pppdNum"
if [ $pppdNum -le 1 ]
then
#if vpn don't connect, pppd will die in seconds
#so wait 10 secs to check proccess 'pppd' again if the pppd has died!
echo "vpn is down,waitting for connectting again.."
sleep 10
pppdNum_1=`ps -e | grep 'pppd' | wc -l`
echo "pppdNum = $pppdNum_1"
#if vpn has auto connect success again,this will do nothing!
#if vpn don't auto connect again, the pppd will die really!
if [ $pppdNum_1 -ge 2 ]
then
echo "vpn has autolly connect success again!"
route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
else
echo "connectting.."
echo 'c vpn_client' > /var/run/xl2tpd/l2tp-control
sleep 10
route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
fi
fi
sleep 5
done
在20:11左右,网络恢复,最终实现自动重连,如下:
我的思路主要是通过判断进程pppd是否死掉,死了就间隔一段时间再判断,如果确定死了就说明VPN断开了,这时进行重新启动。脚本应用到系统中时可以删掉“echo "pppdNum = $pppdNum"",这只是调试时为了方便查看。
欢迎各位指正!!