免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 27010 | 回复: 134

红袖添香:续问.......!!!!! [复制链接]

论坛徽章:
0
发表于 2003-01-19 23:27 |显示全部楼层
##############################
#134.1.1.x1  网点一
#134.1.1.x2  网点二
#134.1.1.x3  网点三
#134.1.1.x4  网点四
#134.1.1.x5  网点五
.............
..............
............
........
##############################
#!/bin/sh

while read ip ; do
   ping -c 5 $ip &
   sleep 2 && echo "\033[1m*** time is over, terminate $ip ***\033[m"
   ps -ef | awk -v pat="ping.*$ip" '$0 ~ pat {print $2}' | xargs kill -9
done <<EOF
134.1.1.x1
134.1.1.x2
134.1.1.x3
134.1.1.x4
134.1.1.x5
.............
..............
............
........
EOF

经过你的指点,使我运用了以上的程序,大大地提高了工作效率,真要谢谢你了
以前我用手工ping 一个网点,要中断一个,很不方便。所以曾经也想用循环方式ping一个网点然后用$?判断是网点还在使用,但是在线网点ping -c 2,经过2
秒马上能退出返回,可以进入下一个网点判断。而网点断网了的话,那就不会在2秒后马上退出,也就是ping -c 2不起作用,它要经过很长时间退出,才会得到$?值,而我ping的地址很多,效率及低,而且我的目的是在营业结束后,调查还有几个网点在线,要是所有网点都断线了,我就可以日终了,因此这个方法不可取,而手工的方法虽然比这个快点难很麻烦,又要丢ping网点。而现在用上了你的方法使我方便及了!!!!

但是我现在还有一些想法,不知能不能实现,还想完美一点,还要向你请教!!!!

即我在运用这个程序时
屏幕上不想出现ping的信息即:ping 134.1.1.x(125.1.1.x):56 data bytes
                   64 bytes from 134.1.1.x:icmp_seq=0 ttl=255 time=0 ms
我想来的直观一点,只要有以下信息:
          网点一        在线
          网点二        断线
          网点三        断线
          ........          ...
          ........          ....
换而言之,既要用上你上面的程序,但也要加上 $?判断语法,两者能不能结合起来呢,要是这样又不失效率,又直观,那多么好啊!!!!
你认为我的想法行吗???
再次谢谢你!!!!!!!!!!

论坛徽章:
0
发表于 2003-01-20 20:36 |显示全部楼层

红袖添香:续问.......!!!!!

...


可是这两者是矛盾的呀。

用 $? 查的是程序的退出时的 exit code,而上次跟你说的例子是不管进程的状态,只要时间到了,就杀死进程。

那我建议你还是用你原来的方法,以保证得到正确的 ping 的 $?,如果你要是嫌它慢的话,可以设定一下参数

ping -c 2 -w 1 HOST_IP

w 表示 maxwait,即等待对方应答发送下一个数据包之间的间隔,默认的 w 是10秒钟,调小点就好了,比如我这里用了1.

记得你是SCO,不知道是不是一样,如果不一样再作理论。(这点是 Solaris 好了,更容易 parse 一些,因为它默认情况就是输出一句话,比如 ping 通了就是:

  xxx is alive

而不是一长串的无休止的 ping 的数据。。。)

论坛徽章:
0
发表于 2003-01-20 21:43 |显示全部楼层

红袖添香:续问.......!!!!!

谢谢你,想不到还有-w参数,我从来没见到过啊,我真佩服你啊!!!!!
我用到:
ping -c 2 -w 1 134.1.1.9
不管它通与不通,现在马上能得到$?的值了,效率提高了,现在可以不用以前
kill进程的方法了,但这种方法也值得学习,以后也有用处的。

论坛徽章:
0
发表于 2003-01-20 21:59 |显示全部楼层

红袖添香:续问.......!!!!!

对了,我忘说了,激动地马上按发送了。我试过sco也和你说的一样的,我以前怎么会不知道有-w的参数 ,而且默认的 w 是10秒钟。我以前就纳闷,我明明ping -c 1 HOST_IP 已经设一秒钟了,通的话很快,不通的话还要等这么长时间,现在终于明白了,有你的帮助,使我还不算明白的太晚。。。。。。!!!!!

论坛徽章:
0
发表于 2003-01-20 22:21 |显示全部楼层

红袖添香:续问.......!!!!!

[quote]原帖由 "GM"]我以前就纳闷,我明明ping -c 1 HOST_IP 已经设一秒钟了,通的话很快,不通的话还要等这?.........[/quote 发表:


呵呵,有些东西用得多了,就不会深究它了。

另外,可能你没注意,  

-c 指的是发送包的个数 (count),不是时间

论坛徽章:
0
发表于 2003-01-20 22:38 |显示全部楼层

红袖添香:续问.......!!!!!

哦,是这样的,我还以为是时间呢,呵呵!!!!
感谢!!!!

论坛徽章:
0
发表于 2003-01-20 23:32 |显示全部楼层

红袖添香:续问.......!!!!!

红袖兄:
我编了一个,请你给我指点一下好吗?
首先我先把所有网点地址放在一个文件中:文件名为:ip.txt
程序如下:
for i in `cat ip.txt`
do
ping -c 2 -w2 $i 1 >/dev/null 2>&amp;1
if [ $? -ne 0 ]
then
echo "$i 断线"
else
echo "$i 在线"
fi
done


虽然这个程序可行,但是有一个小小的缺陷,我在屏幕上反映的是
“134.1.1.1   断线”
“134.1.1.2   在线”
“...............    ....”
"...............    ...."
我想达到,要用文名代替数 字地址即:
“网点一        断线”
“网点二        在线”
“网点三        在线”
“........         ..... ”
因为网点多这样更能直观反映它的状况,要达到这种效果,如何处理呢???
请赐教,谢了!!!!!

论坛徽章:
0
发表于 2003-01-21 00:08 |显示全部楼层

红袖添香:续问.......!!!!!

....



简单一点就是这样了,


  1. for i in `cat ip.txt`; do
  2.     node=`echo $i | awk  -F'.' '{print $4}'`
  3.     ping -c 2 -w 2 $i 2>&1 >/dev/null

  4.     if [ $? -ne 0 ]; then
  5.         echo "网点$node 断线"
  6.     else
  7.         echo "网点$node 在线"
  8.     fi
  9. done
复制代码


但是并没有使用中文数字一、二、三等(必须吗?),不知道SCO的本地化怎样,所以无从下手。不然就得做一个很大的对应表。

论坛徽章:
0
发表于 2003-01-21 00:43 |显示全部楼层

红袖添香:续问.......!!!!!

红袖兄是我讲得不明白对不起,我讲的网点一,网点二,不是这样的连惯的,我是代替名,具体是有名的,比如,城东支行,城南支行,......等等,现在我想要在屏幕上出现:
134.1.1.23  城南支行    在线
134.1.1.12  城北支行    断线
134.1.1.9    江山支行    在线
..............     ........        .....
..............     .........       ....
我想把地址和网点名和线路状况一起反映出来会更好,你说是吧,但我把地址和网点名一起放在$i,在ping时会出错,要怎样解决这个问题呢???
谢谢你,这么晚了还在为我解难!!!!!

论坛徽章:
0
发表于 2003-01-21 01:12 |显示全部楼层

红袖添香:续问.......!!!!!

...

哦,是这样啊~

把 IP 和 网点同时放到文件 ip.txt 中去,列与列之间当中以一个或多个空格或TAB隔开
...
134.1.1.23 城南支行
134.1.1.12 城北支行
134.1.1.9  江山支行
...

然后,代码要稍作修改,for ... in ... 将会把 “134.1.1.23 城南支行”当作两个参数,这里改用 while read 来读,


  1. while read i ; do

  2.     ip=`echo $i | awk  '{print $1}'`
  3.     node=`echo $i | awk '{print $2}'`

  4.     ping -c 2 -w 2 ${ip} 2>&1 >/dev/null

  5.     if [ $? -ne 0 ]; then
  6.         echo "$ip $node 断线"
  7.     else
  8.         echo "$ip $node 在线"
  9.     fi
  10. done < ip.txt
复制代码


(不用客气,还早呢,我反正也在网上,顺便而已)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP