Linux下监控文件变化并抓取系统运行参数

最近遇到一个需求:

web应用层往中间件发送信息的时候,经常出现莫名奇妙的异常,为了定位该中间件发送客户端的bug,需要抓取异常瞬间的系统运行参数: momery dumptcp dump等.

  1. 当发生异常时已经将发送失败的信息打印到了日志文件中。
  2. 异常不定期的发生。

针对这个问题,手动的跟踪肯定不现实。因此,需要通过脚本监控日志文件的变化,且在变化的瞬间捕获系统运行参数。

系统参数

cat /etc/redhat-release
CentOS Linux release 7.0 (Final)

Linux的文件监控工具 inotify-tools

inotify-tools提供的两个命令行工具:

inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。

inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

在此次需求中,需要使用inotifywait

inotifywait命令使用简介:

inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:

-m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;

-r, --recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。

-e , --event :指定要监控的特定事件,默认是监控所有的事件;此处包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;

--timefmt :当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';

--format :自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:

%w:显示被监控文件的文件名;

%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;

%T:使用--timefmt选项中自定义的时间格式;

例如,要监控/tmp/test目录及其内部所有文件上发生的create,delete,modify,close_write事件,则使用如下命令:

inotify -r --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/test

此命令在监控到某文件上第一次事件后就会退出,如果想一直监控,则需要为命令添加-m选项。

更详细的使用介绍: 系统监控工具----Inotify-Tools, 关于原理: 基于inotify机制的实时文件监控

安装

yum --enablerepo=epel -y install inotify-tools

编写shell脚本并运行

1. 编写shell脚本

#!/bin/bash
DIR=$1
echo $1   
tomcatport=$(ps -ef | grep tomcat | grep -v grep | awk '{print $2}' )
echo $tomcatport
echo 'wait'
inotifywait  -e modify $DIR
echo $1
echo 'file change , then tcp dump'
tcpdump -i eth1 -c 1000 > tcpdump.log
echo 'dump end, then memory dump'
jmap -dump:format=b,file=heap.hprof $tomcatport
echo 'all done'
exit
  1. 文件一旦变化,打印memory dumptcp dump
  2. memory dump 需要先获取 tomcatPID

如果需要循环监听文件变化, 可以给inotifywait添加-m参数, 并通过管道添加while循环

#!/bin/bash
 DIR=$1    
 echo $1   
 tomcatport=$(ps -ef | grep tomcat | grep -v grep | awk '{print $2}' )
 echo $tomcatport

echo 'wait'
inotifywait -m -e close_write $DIR --format "%w%f" | while read FILE
do
    tcpdump -i eth1    -c 100 > tcpdump.log
    jmap -dump:format=b,file=heap.hprof $tomcatport
done

保存成shell脚本文件: Monica.sh

2. 上传到服务器

rz -e

将dos命令符修改为unix [可选] 由于lz使用的是windows系统,需要将文件转码

dos2unix Monica.sh

3. 添加可执行权限

chmod +x Monica.sh

4. 运行

sh Monica.sh /data/logs/ocece-message.log &

参考文献

  1. inotify用法简介及以之结合rsync实现主机间的文件实时同步
  2. Inotify: 高效、实时的Linux文件系统事件监控框架

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

张作峰的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zhisheng

Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/

682
来自专栏挖掘大数据

零基础学习大数据,搭建Hadoop处理环境

由于Hadoop需要运行在Linux环境中,而且是分布式的,因此个人学习只能装虚拟机,本文都以VMware Workstation为准,安装CentOS7,具...

2K10
来自专栏L宝宝聊IT

权限管理和备份实例

1827
来自专栏Laoqi's Linux运维专列

Jenkins发布php代码

2123
来自专栏Python中文社区

Flask一步步搭建web应用

專 欄 ❈ 夏轩,Python中文社区专栏作者。 博客:http://blog.csdn.net/u012734441 ❈ 1.flask介绍 2.所需工具...

1868
来自专栏Jay的后台开发笔记

简单的linux系统配置故障定位与排除

本文旨在通过一些常用命令的用法示例,让有一定linux基础的开发同学能对系统进行简单配置,也能够上服务器定位或者解决一些简单基础性的问题,做出初步故障排除,或者...

1004
来自专栏青枫的专栏

在 Windows 系统中安装 SSH 服务

在Mac下搭建了ssh服务,并且测试通过,但是当到windows上,我想以同样的方式操作的时候,事实告诉我,“我太TM天真了!”,没办法,重新百度了一下,发现w...

1262
来自专栏小樱的经验随笔

一文让你熟练掌握Linux的ncat(nc)命令

ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。 它被设计...

631
来自专栏大数据技术学习

零基础学习大数据,搭建Hadoop处理环境

由于Hadoop需要运行在Linux环境中,而且是分布式的,因此个人学习只能装虚拟机,本文都以VMware Workstation为准,安装CentOS7,具体...

2227
来自专栏北京马哥教育

原创投稿 | 使用nagios监控主机及服务

写在前头:限于个人对nagios的了解有限,写得不够深入与系统,甚至可能会有些错误,各位看官还多包涵。本文主要涉及的是nagios daemon、nrpe及三个...

28411

扫码关注云+社区