歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu 聯網後自動運行程序 監測網絡連接

Ubuntu 聯網後自動運行程序 監測網絡連接

日期:2017/2/28 14:54:05   编辑:Linux教程

前言

之前的一篇文章介紹了利用update-rc.d管理Ubuntu開機啟動運行的程序,鏈接見:update-rc.d管理Ubuntu開機啟動程序 http://www.linuxidc.com/Linux/2013-01/77557.htm ,當時想解決的問題是開機啟動自動連接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

  1. 首先,說一個bug,ubuntu的/etc/network/if-down.d/和/etc/network/if-post-down.d/目錄下的腳本並不會在網絡斷開時執行,原因我google也沒找到
  2. 強調,千萬不要思維定式,花了幾個小時的時間解決這個問題就是思維定式了,可以考慮寫個監測腳本檢測網絡是否暢通,如果網絡down掉則kill掉所有的vpn進程即可,然後crontab定時運行就ok了,上腳本代碼

#!/bin/bash

#變量定義
urls=("www.88181.com" "www.linuxidc.com" "www.6688.cc")
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

後記
大家有更好的方法歡迎留言了,希望跟大家探討!

Copyright © Linux教程網 All Rights Reserved