Chinaunix

标题: shell 求解 [打印本页]

作者: hcq989    时间: 2009-02-26 20:00
标题: shell 求解
3) 编写 ping1.sh 程序,要求包括以下功能:
   1. 后台运行 ping localhost 命令监视网络的连通情况;
   2. 当后台运行的 ping 进程数大于等于 20 个时,停止启动新的进程;
   3. 当后台运行的 ping 进程数小于 20 个时,开始启动新的进程,每隔 2 秒启动一个新进程;
4) 编写 ping2.sh 程序,用 crontab 每隔 30 秒定时运行一次,要求包括以下功能:
   1. 监视后台运行的 ping 进程数;
   2. 当后台运行的 ping 进程数大于 10 个时,停止最早启动的进程,直到保持 10 个进程后,结束运行;
   3. 当后台运行的 ping 进程数小于等于 10 个时,不进行任何处理,结束运行;
问题:  如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?

我的思路
3题
#/usr/bin/sh
#grad /etc/hosts and ping each address
while true
do
  if [[ `ps -ef | grep "ping localhost" | wc -l` -lt 20 ]]
  then
      sleep 2
      nohup ping localhost &  
  fi
done
4题 只写了一点
#/usr/bin/sh
  until [[ `ps -ef | grep "ping localhost" | wc -l` -lt 10 ]]
  do
     kill -9  后面的不会写了
  done

如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?
这个问题应该用awk {print ...} 一个文件(里面是待kill的进程列表)
但不会做,烦请帮忙
作者: haimming    时间: 2009-02-26 20:27
作业么?
作者: ywlscpl    时间: 2009-02-26 21:33
应该没什么难度
作者: 飞鸿无痕    时间: 2009-02-26 21:59
原帖由 hcq989 于 2009-2-26 20:00 发表
3) 编写 ping1.sh 程序,要求包括以下功能:
   1. 后台运行 ping localhost 命令监视网络的连通情况;
   2. 当后台运行的 ping 进程数大于等于 20 个时,停止启动新的进程;
   3. 当后台运行的 ping 进程 ...


try:
  1. #/bin/bash
  2.   until [[ `ps -ef | grep "ping localhost" | wc -l` -lt 10 ]]
  3.   do
  4.      kill -9  `ps -ef | grep ping |head -1 |awk '{print $2}'`
  5.   done
复制代码

作者: justlooks    时间: 2009-02-26 22:12
如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?
kill的时候输出信息到 STDOUT 或者写在日志文件里啊
作者: hcq989    时间: 2009-02-26 23:48
标题: 回复 #4 飞鸿无痕 的帖子
您好,试了您的方法,还是没有达到要求,奇怪的是会多出一些ping localhost进程
作者: 飞鸿无痕    时间: 2009-02-27 11:08
原帖由 hcq989 于 2009-2-26 23:48 发表
您好,试了您的方法,还是没有达到要求,奇怪的是会多出一些ping localhost进程


你第四题只说说监控后台启动的ping进程,保持在10个进程或者以内,用我那个我测试了下没有问题啊!
我的做法是这样,先crontab里面加ping localhost ,启动十几个进程,在crontab里加那个脚本,执行,你再检查ping进程数就可以了!!!
作者: 飞鸿无痕    时间: 2009-02-27 11:31
原帖由 justlooks 于 2009-2-26 22:12 发表
如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?
kill的时候输出信息到 STDOUT 或者写在日志文件里啊


这个简单,只要吧脚本里的head看到的进程的ID定向到一个文件里就可以了!
作者: ywlscpl    时间: 2009-02-27 15:53
监测网络不需要搞那么多ping进程吧,给个大概框架,具体ping的结果很多种,还需做一定修改
nohup ping1.sh &
  1. #!/bin/ksh
  2. target="localhost"
  3. count=5
  4. size=1024
  5. time=0.2
  6. logfile="ping.log"
  7. >$logfile

  8. while true
  9. do
  10.   rate=`ping -c $count -s $size -i $time $target 2>/dev/null | awk '/loss/{print $6}'`
  11.   case $rate in
  12.     "0%")
  13.       ;;
  14.   "100%")
  15.       printf "`date` ### " >>ping.log
  16.       echo "目标$target网络不通"
  17.       echo "目标$target网络不通" >>ping.log
  18.       ;;
  19.    "")
  20.       printf "`date` ### " >>ping.log
  21.       echo "ping无输出,检查target:$target"
  22.       echo "ping无输出,检查target:$target" >>ping.log
  23.       exit 1
  24.       ;;
  25.    *)
  26.       printf "`date` ### " >>ping.log
  27.       echo "丢包率$rate%"
  28.       echo "丢包率$rate%" >>ping.log
  29.       ;;
  30.   esac
  31. done
复制代码

作者: ywlscpl    时间: 2009-02-27 15:54
第4题
  1. #!/bin/ksh
  2. logfile="kill.log"
  3. num=`ps -ef|grep "ping localhost" | awk '!/grep/'| wc -l`
  4. if [ $num -gt 10 ];
  5.   then
  6.     echo `date` >>$logfile
  7.     for pid in `ps -ef | grep "ping localhost" | awk '!/grep/{print $2}' | sort -r | awk 'NR>10'`
  8.     do
  9.       kill -9 $pid
  10.       echo "kill进程$pid" >>$logfile
  11.     done
  12. fi
  13. exit 0
复制代码


杀掉的进程号查看kill.log

[ 本帖最后由 ywlscpl 于 2009-2-27 16:04 编辑 ]
作者: 飞鸿无痕    时间: 2009-02-27 18:40
写的很详细,不错!!!支持下!
作者: hcq989    时间: 2009-02-27 19:33
8楼楼主,根据您的指点我重写了程序,已经可以了,谢谢
---------------------------------------------------------------------------------------------------------------
#/usr/bin/sh
while true
do
  if [[ `ps -ef | grep "ping localhost$" | grep -v "grep" | wc -l` -lt 20 ]]
  then
      sleep 2
      nohup ping localhost &  
  else
     break
  fi
done
--------------------------------------------------------------------------------------------------------------
#/usr/bin/sh
  until [[ `ps -ef | grep "ping localhost$" |grep -v "grep" | wc -l` -le 10 ]]
  do
     kill -9  `ps -ef | grep "ping localhost" |grep -v "grep"| head -1 |awk '{print $2}'`  
     echo `ps -ef | grep "ping localhost" |grep -v "grep"| head -1 |awk '{print $2}'`
  done
  -----------------------------------------------------------------------------------------------------------
不过还有个问题请教:
有关crontab 这个命令
首先crontab -e
输入* * * * * date
之后保存,每分钟显示时间在后台,终端上看不到结果,要如何解决呢
还有如何表示30秒,也就是半分钟 0.5 ?这样是错的 ?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2