前言
之前的一篇文章介绍了利用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
#!/bin/bash
#变量定义
PATH=/sbin:/usr/sbin:/bin:/usr/bin
config_path="/home/wangzhengyi/cloud-1/openvpn-client.ovpn"
#导入环境变量
. /lib/lsb/init-functions
export PATH=$PATH
#网络建立后运行openvpn
log_daemon_msg "starting client openvpn"
nohup openvpn $config_path
(2)在网络断开前,大家要结束掉所有的vpn进程,防止程序出现bug
首先,说一个bug,ubuntu的/etc/network/if-down.d/和/etc/network/if-post-down.d/目录下的脚本并不会在网络断开时执行,原因我google也没找到
强调,千万不要思维定式,花了几个小时的时间解决这个问题就是思维定式了,可以考虑写个监测脚本检测网络是否畅通,一旦网络down掉则kill掉所有的vpn进程即可,然后crontab定时运行就ok了,上脚本代码
#!/bin/bash
#变量定义
urls=("www." "www." "www")
http_code=("200" "301" "302" "404")
count=${#urls[*]}
connected=0
#检测网络
for ((i = 0; i < $count; i ++))
do
url=${urls[$i]}
result=$(curl -o /dev/null -s -m 10 -w %{http_code} $url)
for flag in ${http_code[*]}
do
if [ $flag = $result ];then
connected=$(expr $connected + 1)
fi
done
done
#网络down时kill所有vpn进程
if [ $connected -eq 0 ];then
vpn_pids=$(ps -aux |grep -i 'openvpn'|grep -v 'grep'|awk '{print $2}')
for pid in ${vpn_pids[*]}
do
kill -9 $pid
done
fi
crontab定时运行
* * * * * monitor_scripts
后记
大家有更好的方法欢迎留言了,希望跟大家探讨!