[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的下载及安装
安装:
tar -zxvf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure
make
make install # 需要root权限
inotify-tools 使用
安装之后会有 inotifywait
和 inotifywatch
两个程序.
- inotifywait 通过inotify提供了对文件改变的监视
- inotifywatch 通过inotify提供了对文件系统访问的统计
inotifywait使用
参数说明
参数 | 说明 |
---|---|
-m | 事件发生后不退出,默认当事件发生后退出 |
-r | 递归监控当前目录下的所有文件和目录.(默认的文件和目录数最大是 8192个;如果不满足可以修改/proc/sys/fs/inotify/max_user_watches . |
-o <file> | Print events to <file> rather than stdout. |
-s | Send errors to syslog rather than stderr. |
-q | Print less (only print events). |
Print nothing (not even events). | |
–format <fmt> | 输出指定内容格式. |
–timefmt <fmt> | 指定输出时间格式 |
-t <seconds> | 超时时间. |
-e <event1> <event2> … ] | 指定监视事件. |
事件说明
事件 | 说明 |
---|---|
access | file or directory contents were read |
modify | file or directory contents were written |
attrib | file 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 | |
close | file or directory closed, regardless of read/write mode |
open | file or directory opened |
moved_to | file or directory moved to watched directory |
moved_from file or directory moved from watched directory | |
move | file or directory moved to or from watched directory |
create | file or directory created within watched directory |
delete | file or directory deleted within watched directory |
delete_self file or directory was deleted | |
unmount | file 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文件系统事件监控框架
为了避免发布人员将debug版本发到外网,我们内网使用的都是release版本的程序,编译完成之后分离出符号表 ↩