Ubuntu 联网后自动运行程序 监测网络连接

来源:互联网 发布:足球运动员数据库 编辑:程序博客网 时间:2024/06/05 19:58

前言

之前的一篇博客介绍了利用update-rc.d管理ubuntu开机启动运行的程序,链接见:update-rc.d管理Ubuntu开机启动程序 ,当时想解决的问题是开机启动自动连接vpn,但是这种方法可能导致vpn进程僵死状态,因为vpn的链接是跟网卡状态相关的,因此这里介绍一种联网后自动运行自定义程序的方法

概要

在Debian/Ubuntu的发行版本里,网络建立前、后和网络断开前、后都会到/etc/network/里运行相应目录下的脚本
  • if-down.d -- 网络关闭前
  • if-post-down.d -- 网络关闭后
  • if-pre-up.d -- 网络建立前
  • if-up.d -- 网络建立后

思路

(1)在网络建立后,我们要在/etc/network/if-up.d/目录下增加一个自动连接vpn的脚本,这样可以保证只要是联网状态下就可以连接vpn
[html] view plaincopy
  1. #!/bin/bash  
  2.   
  3. #变量定义  
  4. PATH=/sbin:/usr/sbin:/bin:/usr/bin  
  5. config_path="/home/wangzhengyi/cloud-1/openvpn-client.ovpn"  
  6.   
  7. #导入环境变量  
  8. . /lib/lsb/init-functions  
  9. export PATH=$PATH  
  10.   
  11. #网络建立后运行openvpn  
  12. log_daemon_msg "starting client openvpn"  
  13. nohup openvpn $config_path  

(2)在网络断开前,我们要结束掉所有的vpn进程,防止程序出现bug
  1. 首先,说一个bug,ubuntu的/etc/network/if-down.d/和/etc/network/if-post-down.d/目录下的脚本并不会在网络断开时执行,原因我google也没找到
  2. 强调,千万不要思维定式,花了几个小时的时间解决这个问题就是思维定式了,可以考虑写个监测脚本检测网络是否畅通,如果网络down掉则kill掉所有的vpn进程即可,然后crontab定时运行就ok了,上脚本代码
[html] view plaincopy
  1. #!/bin/bash  
  2.   
  3. #变量定义  
  4. urls=("www.baidu.com" "www.sogou.com" "www.soso.com")  
  5. http_code=("200" "301" "302" "404")  
  6. count=${#urls[*]}  
  7. connected=0  
  8.   
  9.   
  10. #检测网络  
  11. for ((i = 0; i < $count; i ++))  
  12. do  
  13.     url=${urls[$i]}  
  14.     result=$(curl -o /dev/null -s -m 10 -w %{http_code} $url)  
  15.     for flag in ${http_code[*]}  
  16.     do  
  17.         if [ $flag = $result ];then  
  18.             connected=$(expr $connected + 1)  
  19.         fi  
  20.     done  
  21. done  
  22.   
  23. #网络down时kill所有vpn进程  
  24. if [ $connected -eq 0 ];then  
  25.     vpn_pids=$(ps -aux |grep -i 'openvpn'|grep -v 'grep'|awk '{print $2}')  
  26.     for pid in ${vpn_pids[*]}  
  27.     do  
  28.         kill -9 $pid  
  29.     done  
  30. fi  

crontab定时运行

[html] view plaincopy
  1. * * * * * monitor_scripts  

原创粉丝点击