[Shell] 简单的自动检查ssh代理是否正常的脚本

As Follows:

 1 #!/bin/bash
 2 
 3 RESPONSE=`curl -s --socks5 127.0.0.1:7070 www.123cha.com`
 4 if [ 0 -eq $? ]
 5 then
 6         echo SUCCESS
 7 else
 8         echo FAILED
 9         echo 'RECONNECT...'
10         ssh -qTfnN -D 7070 user@host
11         if [ 0 -eq $? ]
12         then
13                 echo 'connect success!'
14         else
15                 echo 'connect failed!'
16         fi
17 fi

Add to Crontab:

crontab -e

Add New Line:

* * * * * /bin/bash /PATH/TO/SHELL

## 2014-06-08 Update

实际使用过程中存在一些问题,表现如下:

当网络异常中断又连接之后,会导致出现多个代理进程,最终导致代理失败

想到的解决方法:

每次成功建立连接之后记录连接的进程id

在检测到代理失效之后需要kill掉原来的进程再新建连接

完善后的脚本如下:

#!/bin/bash

echo `date`
CMD="ssh -qTfnN -D 7070 user@host"

# 如果存在运行中的进程则获取其PID
PID=`ps aux|grep -F "$CMD" | grep -v -F 'grep' | awk '{printf $2}'`

# 增加超时限制 30s
# 根据所用代理确定使用哪个域名进行测试
RESPONSE=`curl -s -m 30 --socks5 127.0.0.1:7070 www.google.com`
if [ 0 -eq $? ]
then
        echo "PROXY IS ONLINE"
        echo "PID: $PID"
else
        echo "PROXY IS OFFLINE..."
        # 如果已经存在未结束的进程则结束此进程
        if [ $PID ]
        then
                echo 'KILL exists Process'
                kill -9 $PID
        fi

        echo 'RECONNECT...'
        $CMD
        if [ 0 -eq $? ]
        then
                # 获取进程id, 此处不能使用`$$` 或者 `$!`来获取,因为命令中的-f参数会产生
                # 额外的进程
                PID=`ps aux|grep -F "$CMD" | grep -v -F 'grep' | awk '{printf $2}'`
                echo 'CONNECT SUCCESS!'
                echo "PID: $PID"
        else
                echo 'CONNECT FAILED!'
        fi
fi

## 2014-06-11 UPDATE

实际使用中还是会出现多个进程同时运行的情况。原因应该和切换网络有关

参考地址: http://stackoverflow.com/questions/1821968/pid-of-last-started-process-in-bash-script

原文地址:https://www.cnblogs.com/imoing/p/3764009.html