LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 743|回复: 9

写了一个多重条件的scripts,大家帮我看看是否正确

[复制链接]
发表于 2007-1-3 17:48:17 | 显示全部楼层 |阅读模式
实现要求:
****************************************
如果
       "任务已在队列中“;则”退出“
如果不在;则
”判断是否可以域名解析“;

如果不行;
等候3分钟,
”判断是否可以域名解析“;如果可以;则”退出“

如果还不行;
则”kill 掉一些进程”

重启ppp0端口

“退出” 


*******************************************************

scripts如下:

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
export PATH

#
# test crontab jobs are running
jobs |grep 'auto-connect-adsl'|grep -v 'grep' > /dev/null 2>&1

if [ "$?" != "0" ];then
# test adsl-connection
        /usr/bin/nslookup "www.sina.com.cn" > /dev/null 2>&1
        elif [ "$?" != "0" ] ;then

# if failed wait 3m,
                sleep 3m
                /usr/bin/nslookup "www.sina.com.cn" > /dev/null 2>&1
                elif [ "$?" != "0" ] ;then

# if failed ,kill "pppoe-client" connection
                        kill -15 `ps aux |grep 'pppoe-server'|grep 'Ss'|grep -v 'grep'|awk '{ print $2 }'|grep -v 'awk'`
# up pppo interface
                        /sbin/ifup ppp0 || ifup ppp0

else
        exit 0
fi
#
exit 0



****************************************************

大家帮我看看,这样写是否有问题
发表于 2007-1-3 18:30:55 | 显示全部楼层
其它细节不清楚,但不用专门test返回值,只要if command1; then command2; elif command3; else command4; fi,比如

if jobs |grep -q 'auto-connect-adsl' |grep -v -q 'grep'; then
/usr/bin/nslookup "www.sina.com.cn" > /dev/null 2>&1

这样就可以了,因为if语句就是判断命令返回值是否为0的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-3 20:12:03 | 显示全部楼层
谢谢seamonkey兄的指教,在shell区有幸得到你指教,学到不少哦
回复 支持 反对

使用道具 举报

发表于 2007-1-3 20:23:17 | 显示全部楼层
惭愧死了。不帮倒忙就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-4 10:17:33 | 显示全部楼层
写好了,大家帮忙看看,其实这个shell是解决前段时间求助未果的一个问题,见:

http://www.linuxsir.cn/bbs/showthread.php?t=287313

解决思路如下:

将scripts写入crontab,每5分钟check一次,如果遇到上面问题,则kill掉pppoe-server进程,重启adsl-ppp0端口,再重启pppoe-server

配置如下:

计划任务:
[root@sg tmp]# grep 'adsl' /etc/crontab
05 * * * * root /usr/local/sbin/auto-connect-adsl > /dev/null 2>&1

自动运行scripts,谢谢seamonkey兄提示,并且优化了一下,(感觉nslookup太耗时,如果adsl.pid文件存在,则表示adsl已连接,实现目地一样),如下:

*******************************************************
[root@sg sbin]# cat /usr/local/sbin/auto-connect-adsl
#!/bin/bash
# This file should not be modified -- make local changes to
# /usr/local/sbin/auto-conect-adsl instead
#       TMeng   first release
# Modify by TMeng at 2007/01/03/PM 15:14
# Used for auto-connect-adsl when pppoe-server assign pppo to local user

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
export PATH

#
# test crontab jobs are or not running
if ps aux |grep 'auto-connect-adsl'|grep -v 'grep' > /dev/null 2>&1;then
        exit 0

# test adsl-connection
# if failed wait 2m,
        elif [ ! -f /var/run/pppoe-adsl.pid ];then
                sleep 2m &

# if failed ,kill "pppoe-client" connection
                elif [ ! -f /var/run/pppoe-adsl.pid ] ;then
                        kill -15 `ps aux |grep 'ppp'|grep -v 'grep'|\
                        awk '{ print $2 }'|grep -v 'awk'`
# up pppo interface
                        /sbin/ifup ppp0 || ifup ppp0 || ifup ppp0
                        /usr/sbin/pppoe-server -I eth1 -L 192.168.3.254 -R 192.168.3.1
                        /sbin/service iptables restart > /dev/null 2>&1
fi
#
exit 0


*******************************************************

如有更好的办法,请坛上的DX不涩赐教,不胜感激,谢谢!!
回复 支持 反对

使用道具 举报

发表于 2007-1-4 11:42:01 | 显示全部楼层
很菜 帮我解释一下这句: /dev/null 2>&1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-4 11:43:43 | 显示全部楼层
正常output 和错误output (2>)都重定向至/dev/null,即屏幕不显示
回复 支持 反对

使用道具 举报

发表于 2007-1-4 11:53:34 | 显示全部楼层
谢谢 学习shell
kevin.tan  建议一本好书吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-4 13:57:52 | 显示全部楼层
本区的置顶精华里有,你可以看下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-5 15:10:39 | 显示全部楼层
对本条scripts再优化了一下,
# 只kill 本地的 ppp0 进程,而不是所有的ppp进程,这样pppoe-server和iptables也无需重启了

原语句:
# if failed ,kill "pppoe-client" connection
elif [ ! -f /var/run/pppoe-adsl.pid ] ;then
kill -15 `ps aux |grep 'ppp'|grep -v 'grep'|\
awk '{ print $2 }'|grep -v 'awk'`
# up pppo interface
/sbin/ifup ppp0 || ifup ppp0 || ifup ppp0
/usr/sbin/pppoe-server -I eth1 -L 192.168.3.254 -R 192.168.3.1
/sbin/service iptables restart > /dev/null 2>&1

优化后语句:
# if failed ,kill "pppoe-client" connection
                elif [ ! -f /var/run/pppoe-adsl.pid ] ;then
#                       kill -15 `ps aux |grep 'ppp'|grep -v 'grep'|\
#                       awk '{ print $2 }'|grep -v 'awk'`
# The follow 1 line replace under 2 line
# just kill local ppp0.pid
                        kill -15 `cat /var/run/ppp0.pid`

# up pppo interface
                        /sbin/ifup ppp0 || ifup ppp0 || ifup ppp0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表