inotify-Linux下监控文件系统操作

[TOC]

开发阶段当功能提交之后,测试人员需要频繁的修改系统时间进行功能的测试,系统事件常常被改的天昏地暗. 如果服务器宕机没有及时的反馈到开发人员,那么生成的core文件因无法知道版本[1]而无法查看宕机原因,失去它本身所承载的重要意义,所以需要在生成的文件名中增加Git log的SHA和版本号.

Linux的 core pattern 提供了一些自定义core文件的方法,但只能增加PID,UID,GID,hostname,filename,time,signal ID 这些附加信息,所以只能另寻出路.
inotify 提供了对 Linux 文件系统事件的监控,通过它可以监视目录下的各种事件. inotify 的详细信息参见

inotify-tools 工具包几乎包含了目录和文件的监控,所以本文侧重介绍在bash中使用这个工具.

查看系统是否支持 inotify

inotify 需要 Linux 内核2.6.13以上版本的支持.输入命令 uname -a 查看系统的内核版本号.

inotify-tools的下载及安装

下载地址: http://downloads.sourceforge.net/inotify-tools/inotify-tools-3.13.tar.gz?modtime=1199213676&big_mirror=0

安装:

tar -zxvf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure
make
make install    # 需要root权限

inotify-tools 使用

安装之后会有 inotifywaitinotifywatch 两个程序.

  • inotifywait 通过inotify提供了对文件改变的监视
  • inotifywatch 通过inotify提供了对文件系统访问的统计

inotifywait使用

参数说明

参数说明
-m事件发生后不退出,默认当事件发生后退出
-r递归监控当前目录下的所有文件和目录.(默认的文件和目录数最大是 8192个;如果不满足可以修改/proc/sys/fs/inotify/max_user_watches .
-o <file>Print events to <file> rather than stdout.
-sSend errors to syslog rather than stderr.
-qPrint less (only print events).
-qqPrint nothing (not even events).
–format <fmt>输出指定内容格式.
–timefmt <fmt>指定输出时间格式
-t <seconds>超时时间.
-e <event1> <event2> … ]指定监视事件.

事件说明

事件说明
accessfile or directory contents were read
modifyfile or directory contents were written
attribfile or directory attributes changed
close_write file or directory closed, after being opened in writeable mode
close_nowrite file or directory closed, after being opened in read-only mode
closefile or directory closed, regardless of read/write mode
openfile or directory opened
moved_tofile or directory moved to watched directory
moved_from file or directory moved from watched directory
movefile or directory moved to or from watched directory
createfile or directory created within watched directory
deletefile or directory deleted within watched directory
delete_self file or directory was deleted
unmountfile system containing file or directory unmounted

详细的信息可以使用 man inotifywait 查看.

解决方案

当前目录下生成 core 文件之后,将 core 文件重命名为 core.filename.pid_version_sha 格式.
修改core pattern生成core.filename.pid格式的文件:

echo "core.%e.%p" > /proc/sys/kernel/core_pattern
echo "1" > /proc/sys/kernel/core_uses_pid

监视脚本:

#!/bin/bash

dir=$1
inotifywait -m -q -r -e close_write --format '%f' $dir | while read file
do
    if [[ $file == core.t3* ]];
    then
        log=`sed -n "/commit/ s/commit //p"` ../bin/bin.gitlog
        vsn=`cat ../bin/version.txt`
        mv $file ${file}_${vsn}_${log}
    fi
done

拓展:
Inotify: 高效、实时的Linux文件系统事件监控框架

  1. 为了避免发布人员将debug版本发到外网,我们内网使用的都是release版本的程序,编译完成之后分离出符号表

    原文作者:倚楼
    原文地址: https://www.jianshu.com/p/ce4a94eb88ff
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞