前言之前的一篇部落格介紹了利用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
#!/bin/bash#變數定義PATH=/sbin:/usr/sbin:/bin:/usr/binconfig_path="/home/wangzhengyi/cloud-1/openvpn-client.ovpn"#匯入環境變數. /lib/lsb/init-functionsexport PATH=$PATH#網路建立後運行openvpnlog_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.baidu.com" "www.sogou.com" "www.soso.com")http_code=("200" "301" "302" "404")count=${#urls[*]}connected=0#檢測網路for ((i = 0; i < $count; i ++))dourl=${urls[$i]}result=$(curl -o /dev/null -s -m 10 -w %{http_code} $url)for flag in ${http_code[*]}doif [ $flag = $result ];thenconnected=$(expr $connected + 1)fidonedone#網路down時kill所有vpn進程if [ $connected -eq 0 ];thenvpn_pids=$(ps -aux |grep -i 'openvpn'|grep -v 'grep'|awk '{print $2}')for pid in ${vpn_pids[*]}dokill -9 $piddonefi
crontab定時運行
* * * * * monitor_scripts
後記大家有更好的方法歡迎留言了,希望跟大家探討!