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