免费注册 查看新帖 |

Chinaunix

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

[其他] 求个思路或者来语句也可以 [复制链接]

论坛徽章:
39
双子座
日期:2014-08-06 17:37:19极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:1915-16赛季CBA联赛之江苏
日期:2017-04-26 17:19:08黑曼巴
日期:2018-03-07 18:56:5615-16赛季CBA联赛之八一
日期:2018-03-09 10:44:1015-16赛季CBA联赛之江苏
日期:2018-03-12 15:12:1915-16赛季CBA联赛之青岛
日期:2018-03-16 09:13:0515-16赛季CBA联赛之山东
日期:2018-04-27 18:23:0515-16赛季CBA联赛之新疆
日期:2018-05-04 11:29:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-08 14:58 |只看该作者 |倒序浏览
本帖最后由 o枫叶o飘零 于 2014-10-08 14:57 编辑


  1. 脚本每30分钟执行一次
  2. #!/bin/sh
  3. if
  4. [ ! -f lasttotalpostmd ];
  5. #####检测lasttotakpostmd文件是否不存在;
  6. then
  7. du -b postmd.out>lasttotalpostmd;
  8. #####当不存在时,按字节数统计postmd.out文件大小,讲结果输出到lasttotalpostmd;

  9. else
  10. #####当存在时,做下面动作
  11. now=`du -b postmd.out|awk '{print $1}'`
  12. #####定义变量now=按字节数统计postmd.out日志大小
  13. last=`awk '{print $1}' lasttotalpostmd`
  14. #####定义变量last=lasttotalpostmd里面的第一列===================>就是30分钟前的postmd.out日志的大小
  15. jincheng=`ps -ef | grep java | awk '/postmd/{print $2}'`
  16. #####定义变量进程=java进程ID
  17. echo $now
  18. echo $last
  19. if
  20. [ "$now" = "$last" ]
  21. #####如果现在日志大小和上30分钟前日志大小相等

  22. then
  23. kill -9 $jincheng
  24. #####杀死java进程
  25. rm -rf postmd.out
  26. #####删除java日志文件
  27. rm -rf lasttotalpostmd
  28. #####删除上次统计postmd.out文件
  29. nohup java -Xms1024m -Xmx5000m -jar postmd.jar>postmd.out &
  30. #####重新启动java将日志输出到postmd.out里
  31. else
  32. echo $now>lasttotalpostmd
  33. #####日志不相等时,只讲当前日志大小记录覆盖到lasttotalpostmd中
  34. fi
  35. fi
复制代码
先上代码
代码的意图和结果如下:
我有java进程   postmd


脚本放上服务器  第一次执行的时候  只会统计postmd.out日志的大小并保存在lasttotalpostmd文件里面
从第二次执行时(30分钟后)    实时统计postmd.out日志大小    与lasttotalpostmd里比较
当2者相等时,说明postmd.out日志在30分钟内没有任何变化,需要重启服务



我的目的总结一下
第一统计*.out日志的大小>lasttotalpostmd
从第二次开始  每次统计一次*.out日志的大小 和lasttotalpostmd比较
如果相等,就杀死java进程,删除java日志文件,删除lasttotalpostmd文件,重启java服务,
不相等时,就把这次统计的信息覆盖到lasttotalpostmd里



问题来了
这个脚本只针对已知的java名,并且是针对1个java的情况
当服务器有多个java时,我就蛋疼了
多个java   多个*.out日志
*.out日志的名字就是已java的日志名来命名的

就像下面的情况

postmd=========>postmd.out
datamd=========>datamd.out
从日志文件名可以获取进程名字
也可以从进程名获取日志名

我可以获取到这里*.jar的名字

但是需要怎么做  才能达到我上面的要求????
我想着用for循环,但是做到日志比对那里就不会了

难道是几个java就要写几个脚本?????


跪求思路 或者上代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
2 [报告]
发表于 2014-10-08 15:10 |只看该作者
本帖最后由 bulletmarquis 于 2014-10-08 15:13 编辑

回复 1# o枫叶o飘零


    没太看懂。。。

   仅仅是想判断日志情况的话,可以用stat命令检查日志最近更新时间和字符数,判断起来非常简单
   既然日志文件名和进程名是一一对应的,这个处理不是应该挺简单的么

   写一个list文件,每个日志名、进程号、修改时间、当前大小写到一行里,下一次执行的时候,遍历扫描这个list,发现日志没变的,则将进程杀掉,扫描完后重新生成一个list文件,如些循环

   感觉awk就可以了

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2014-10-08 15:13 |只看该作者
动态获取呐, 先获取到所有Java进程,然后在循环 的干活..

论坛徽章:
39
双子座
日期:2014-08-06 17:37:19极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:1915-16赛季CBA联赛之江苏
日期:2017-04-26 17:19:08黑曼巴
日期:2018-03-07 18:56:5615-16赛季CBA联赛之八一
日期:2018-03-09 10:44:1015-16赛季CBA联赛之江苏
日期:2018-03-12 15:12:1915-16赛季CBA联赛之青岛
日期:2018-03-16 09:13:0515-16赛季CBA联赛之山东
日期:2018-04-27 18:23:0515-16赛季CBA联赛之新疆
日期:2018-05-04 11:29:30
4 [报告]
发表于 2014-10-08 15:14 |只看该作者
回复 2# bulletmarquis


    我说精辟点吧

就是根据日志文件的大小变化来判断是否需要杀死该进程,并重启该进程

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
5 [报告]
发表于 2014-10-08 15:24 |只看该作者
本帖最后由 bulletmarquis 于 2014-10-08 15:25 编辑

回复 4# o枫叶o飘零


    LZ的AWK熟不?我理解大致是这个样子的
  1. stat -c "%n %s %y" *.out
复制代码
第一次脚本执行的时间,用这个获取当前日志列表,存到文件list里面
   下一次执行,先list改名为list_old,然后用这个命令生成一个新的list,下面操作就简单了
    用awk比较list_old和list,如果$1相等,但是$0不同,说明文件被修改过,在awk里面用system或者getline杀掉对应的进程
   然后再重新生成一次list,等待下一轮执行

   不知道有没有说清楚,语文是驾校老师教的~~

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
6 [报告]
发表于 2014-10-08 15:32 |只看该作者
回复 5# bulletmarquis


   
对 awk 真是情有独钟啊  {:3_189:}

论坛徽章:
39
双子座
日期:2014-08-06 17:37:19极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:1915-16赛季CBA联赛之江苏
日期:2017-04-26 17:19:08黑曼巴
日期:2018-03-07 18:56:5615-16赛季CBA联赛之八一
日期:2018-03-09 10:44:1015-16赛季CBA联赛之江苏
日期:2018-03-12 15:12:1915-16赛季CBA联赛之青岛
日期:2018-03-16 09:13:0515-16赛季CBA联赛之山东
日期:2018-04-27 18:23:0515-16赛季CBA联赛之新疆
日期:2018-05-04 11:29:30
7 [报告]
发表于 2014-10-08 15:33 |只看该作者
回复 5# bulletmarquis


    AWK太高端了,我先用基本的shell语句写,写完了再用你那方法研究研究

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
8 [报告]
发表于 2014-10-08 15:33 |只看该作者
回复 6# reyleon


    只会awk,不会sed和grep,真是囧了个囧{:2_169:}

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
9 [报告]
发表于 2014-10-08 15:34 |只看该作者
回复 7# o枫叶o飘零


    我觉得你的问题重点就是在于生成新老两份日志列表,然后进行比对,判断哪些进程要杀

   用什么方式来写倒无所谓

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
10 [报告]
发表于 2014-10-08 16:06 |只看该作者
学生党:飘过~如果楼主只会shell的话也没问题~用cmp静默比较如下就可以了
$ cmp -s yhsafe.txt yhsafe2.txt
$ echo $?

说明:0为相同,非0为不同!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP