免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2592 | 回复: 11
打印 上一主题 下一主题

shell 求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-26 20:00 |只看该作者 |倒序浏览
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的进程列表)
但不会做,烦请帮忙

论坛徽章:
0
2 [报告]
发表于 2009-02-26 20:27 |只看该作者
作业么?

论坛徽章:
0
3 [报告]
发表于 2009-02-26 21:33 |只看该作者
应该没什么难度

论坛徽章:
0
4 [报告]
发表于 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
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-02-26 22:12 |只看该作者
如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?
kill的时候输出信息到 STDOUT 或者写在日志文件里啊

论坛徽章:
0
6 [报告]
发表于 2009-02-26 23:48 |只看该作者

回复 #4 飞鸿无痕 的帖子

您好,试了您的方法,还是没有达到要求,奇怪的是会多出一些ping localhost进程

论坛徽章:
0
7 [报告]
发表于 2009-02-27 11:08 |只看该作者
原帖由 hcq989 于 2009-2-26 23:48 发表
您好,试了您的方法,还是没有达到要求,奇怪的是会多出一些ping localhost进程


你第四题只说说监控后台启动的ping进程,保持在10个进程或者以内,用我那个我测试了下没有问题啊!
我的做法是这样,先crontab里面加ping localhost ,启动十几个进程,在crontab里加那个脚本,执行,你再检查ping进程数就可以了!!!

论坛徽章:
0
8 [报告]
发表于 2009-02-27 11:31 |只看该作者
原帖由 justlooks 于 2009-2-26 22:12 发表
如果想查看由 crontab 启动的程序每次输出的杀掉的进程号,应该怎样操作?
kill的时候输出信息到 STDOUT 或者写在日志文件里啊


这个简单,只要吧脚本里的head看到的进程的ID定向到一个文件里就可以了!

论坛徽章:
0
9 [报告]
发表于 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
复制代码

论坛徽章:
0
10 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP