您的位置:首页 > 运维架构 > Shell

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

2014-06-02 06:54 483 查看
As Follows:

#!/bin/bash

RESPONSE=`curl -s --socks5 127.0.0.1:7070 www.123cha.com`
if [ 0 -eq $? ]
then
echo SUCCESS
else
echo FAILED
echo 'RECONNECT...'
ssh -qTfnN -D 7070 user@host
if [ 0 -eq $? ]
then
echo 'connect success!'
else
echo 'connect failed!'
fi
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: