免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yexingqi
打印 上一主题 下一主题

[数值计算] 请教计算程序执行时间的shell脚本 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2018-10-22 16:39 |只看该作者

谢谢您花了这么多的时间来讲解. 受益匪浅 我在linux下用powershell也能运行起来了. 感谢感谢!

还是有点不甘心,在linux shell下面不知道有没有简单的方法也能实现这个要求呢....

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
12 [报告]
发表于 2018-10-22 18:06 |只看该作者
回复 1# yexingqi


  1. #!/bin/bash

  2. starttime=`date +%s`
  3. #用sleep命令模拟运行程序
  4. sleep 100 &
  5. echo $! > 1.pid
  6. pid=`awk '1' 1.pid`
  7. while true
  8. do
  9.     endtime=`date +%s`
  10.     runtime=$((endtime-starttime))
  11.     swith=`ps -eaf|awk '$2=='"${pid}"''`
  12.     if [ -z "${swith}" ];then
  13.         echo "程序运行结束(运行时间${runtime}秒)."
  14.         break
  15.     else
  16.         #设置超时时间
  17.         if [ "${runtime}" -ge 20 ];then
  18.             echo "程序运行时间过长(运行时间${runtime}秒),已停止时间记录."
  19.             echo "开始杀掉超时的进程..."
  20.             kill ${pid}
  21.             echo "进程已杀."
  22.             break
  23.         else
  24.             echo "程序运行正常(运行时间${runtime}秒)."
  25.             continue
  26.         fi
  27.     fi
  28. done
复制代码

论坛徽章:
0
13 [报告]
发表于 2018-10-22 18:42 |只看该作者
本帖最后由 yexingqi 于 2018-10-22 19:02 编辑

回复 12# wh7211

谢谢大侠!! 我测试一切成功!   自已尝试好久还是不理想. 您利害, 赞!!!!
另外,能请教一下这个脚本能否做一点改动? 就是让20秒后自动将模拟的运行程序kill掉,但是这个脚本不要退出,而是继续循环检测? 就是主脚本一直在后台不停地检查...

还有,我尝试把break取消掉但是这个脚本会在屏幕不停地刷屏输出各种提示,每秒有几百行. 请教一下这个怎么修改呢? 我希望它只提示二个信息:
1. 模拟运行程序正常结束时间为xxx(每隔一秒就报一次) ,
2. 程序运行正常,
3. 模拟运行程序超过20秒仍未完成,开始kill ...

再次感谢您的帮助!!!



论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
14 [报告]
发表于 2018-10-23 15:06 |只看该作者
本帖最后由 wh7211 于 2018-10-23 15:09 编辑

回复 13# yexingqi


就是让20秒后自动将模拟的运行程序kill掉,但是这个脚本不要退出,而是继续循环检测? 就是主脚本一直在后台不停地检查...

此检测脚本支持检测1个程序,程序已被kill掉,没有不停检测的必要。如果你想用此脚本检测多个程序,最好把运行程序的代码和检测脚本分开
还有,我尝试把break取消掉但是这个脚本会在屏幕不停地刷屏输出各种提示,每秒有几百行. 请教一下这个怎么修改呢? 我希望它只提示二个信息:

已改成每秒输出1条信息
  1. #!/bin/bash

  2. starttime=`date +%s`
  3. #用sleep命令模拟运行程序
  4. sleep 100 &
  5. echo $! > 1.pid
  6. pid=`awk '1' 1.pid`
  7. while true
  8. do
  9.     endtime=`date +%s`
  10.     runtime=$((endtime-starttime))
  11.     swith=`ps -eaf|awk '$2=='"${pid}"''`
  12.     if [ -z "${swith}" ];then
  13.         echo "程序运行结束(运行时间${runtime}秒)."
  14.         break
  15.     else
  16.         #设置超时时间
  17.         if [ "${runtime}" -ge 20 ];then
  18.             echo "程序运行时间过长(运行时间${runtime}秒),已停止时间记录."
  19.             echo "开始杀掉超时的进程..."
  20.             kill ${pid}
  21.             echo "进程已杀."
  22.             break
  23.         else
  24.             echo "程序运行正常(运行时间${runtime}秒)."
  25.             sleep 1
  26.             continue
  27.         fi
  28.     fi
  29. done
复制代码

论坛徽章:
0
15 [报告]
发表于 2018-10-23 18:43 |只看该作者

再次谢谢您的回复.

我想它重复检查的原因,其实是想检查并记录某些程序的执行时间. 打个比方说:我希望后台监控 "df -lh"这个命令,我不在意它输出的是什么内容,我只需要定期检查它的运行时间是否正常., 如果它的运行时间超过20秒那我不会kill掉,但是会做一个记录. 然后继续检查. 这就是为什么我需要这个脚本循环执行检测.


请问能做到吗? 您的脚本写得很好,就是差这点我不知道怎么改过来. 再次感谢!!!

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
16 [报告]
发表于 2018-10-23 19:05 |只看该作者
本帖最后由 wh7211 于 2018-10-23 19:07 编辑

回复 15# yexingqi


如果它的运行时间超过20秒那我不会kill掉,但是会做一个记录. 然后继续检查.
  1. #!/bin/bash

  2. starttime=`date +%s`
  3. #用sleep命令模拟运行程序
  4. sleep 100 &
  5. echo $! > 1.pid
  6. pid=`awk '1' 1.pid`
  7. while true
  8. do
  9.     endtime=`date +%s`
  10.     runtime=$((endtime-starttime))
  11.     swith=`ps -eaf|awk '$2=='"${pid}"''`
  12.     if [ -z "${swith}" ];then
  13.         echo "程序运行结束(运行时间${runtime}秒)."
  14.         break
  15.     else
  16.         #设置超时时间
  17.         if [ "${runtime}" -lt 20 ];then
  18.             echo "程序运行正常(运行时间${runtime}秒)."
  19.             sleep 1
  20.             continue
  21.         elif [ "${runtime}" -ge 20 ] && [ "$((${runtime}%20))" -eq 0 ];then
  22.             echo "程序运行时间过长,不kill,只记录(运行时间${runtime}秒)."
  23.             sleep 1
  24.         fi
  25.     fi
  26. done
复制代码

论坛徽章:
0
17 [报告]
发表于 2018-10-23 21:43 |只看该作者
本帖最后由 yexingqi 于 2018-10-23 21:51 编辑

回复 16# wh7211
真的很抱歉,肯定是我表达得不好,让您有些误解了。 很抱歉我的描述水平不太好。。。。。

看起来这个脚本并没有执行循环检测,而是在这个模似运行程序执行完后就退出了。 而我是希望循环检测这个执行时间。也就是下面这一段:
#用sleep命令模拟运行程序
sleep 10 &     ##或者换成df -lh ,循环检测这个命令,记录它每次的执行时间,超过指定的时间就报警,但接着又继续检查。



admin@YX:/tmp$ ./2.sh  
程序运行正常(运行时间0秒).
程序运行正常(运行时间1秒).
程序运行正常(运行时间2秒).
程序运行正常(运行时间3秒).
程序运行正常(运行时间4秒).
程序运行结束(运行时间10秒).
admin@YX:/tmp$


以下脚本我稍修改一了下时间值:


#!/bin/bash

starttime=`date +%s`
#用sleep命令模拟运行程序
sleep 10 &
echo $! > 1.pid
pid=`awk '1' 1.pid`
while true
do
   endtime=`date +%s`
   runtime=$((endtime-starttime))
   swith=`ps -eaf|awk '$2=='"${pid}"''`
   if [ -z "${swith}" ];then
      echo "程序运行结束(运行时间${runtime}秒)."
      break
  else
      #设置超时时间
      if [ "${runtime}" -lt 5 ];then
      echo "程序运行正常(运行时间${runtime}秒)."
      sleep 1
      continue
  elif [ "${runtime}" -ge 5 ] && [ "$((${runtime}%20))" -eq 0 ];then
      echo "程序运行时间过长,不kill,只记录(运行时间${runtime}秒)."
      sleep 1
      fi
  fi
done





论坛徽章:
0
18 [报告]
发表于 2018-10-23 21:43 |只看该作者
本帖最后由 yexingqi 于 2018-10-23 21:47 编辑

多了一行

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
19 [报告]
发表于 2018-10-24 10:38 |只看该作者
本帖最后由 wh7211 于 2018-10-24 10:52 编辑

回复 17# yexingqi


而我是希望循环检测这个执行时间。

1、“这个”是指哪个模拟程序?模拟程序1已结束,“这个”是指结束的模拟程序1,还是新的模拟程序[2,3,4...]?
2、模拟程序[2,3,4...]和模拟程序1有什么区别?
(1)命令和参数完全相同
(2)命令相同但参数不同
(3)命令完全不同
3、模拟程序1是在此脚本中写死的,模拟程序[2,3,4...]写死在哪个脚本中?
(1)在此脚本中写死
(2)在另外1个脚本中写死
(3)在另外多个脚本中写死,每个脚本写死1个模拟程序
4、模拟程序[2,3,4...]运行时间?
(1)同时运行
(2)按顺序运行,运行时间间隔为x秒
(3)无规律
#用sleep命令模拟运行程序
sleep 10 &     ##或者换成df -lh ,循环检测这个命令,记录它每次的执行时间,超过指定的时间就报警,但接着又继续检查。

“每次”说明模拟程序不止运行1次,可以把“运行模拟程序”和“检测”分成2个脚本

论坛徽章:
0
20 [报告]
发表于 2018-10-24 17:59 |只看该作者
回复 19# wh7211

再次向您道歉.我的描述很不好....谢谢您还能回复我...我都很不好意思...
我打个比方:
我希望每隔30秒这个脚本就循环运行"df -lh"这个命令.  同时脚本记录每一次"df -lh"的执行时间.如果发现"df -lh"这个命令运行超过10秒了还没有结束,那么就强行将这个命令kill掉,并且记录它的出错时间(报警).

我最初贴出来的脚本就实现了一部分的功能(循环运行检测并记录出错时间,只实现这二点), 但是写得太糟了,并且这个脚本并没有完全满足我的上述需求.........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP