[TOC]
開發(fā)階段當(dāng)功能提交之后,測試人員需要頻繁的修改系統(tǒng)時間進行功能的測試,系統(tǒng)事件常常被改的天昏地暗. 如果服務(wù)器宕機沒有及時的反饋到開發(fā)人員,那么生成的core文件因無法知道版本[1]而無法查看宕機原因,失去它本身所承載的重要意義,所以需要在生成的文件名中增加Git log的SHA和版本號.
Linux的 core pattern 提供了一些自定義core文件的方法,但只能增加PID,UID,GID,hostname,filename,time,signal ID 這些附加信息,所以只能另尋出路.
inotify 提供了對 Linux 文件系統(tǒng)事件的監(jiān)控,通過它可以監(jiān)視目錄下的各種事件. inotify 的詳細信息參見
inotify-tools
工具包幾乎包含了目錄和文件的監(jiān)控,所以本文側(cè)重介紹在bash中使用這個工具.
查看系統(tǒng)是否支持 inotify
inotify 需要 Linux 內(nèi)核2.6.13以上版本的支持.輸入命令 uname -a
查看系統(tǒng)的內(nèi)核版本號.
inotify-tools的下載及安裝
安裝:
tar -zxvf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure
make
make install # 需要root權(quán)限
inotify-tools 使用
安裝之后會有 inotifywait
和 inotifywatch
兩個程序.
- inotifywait 通過inotify提供了對文件改變的監(jiān)視
- inotifywatch 通過inotify提供了對文件系統(tǒng)訪問的統(tǒng)計
inotifywait使用
參數(shù)說明
參數(shù) | 說明 |
---|---|
-m | 事件發(fā)生后不退出,默認當(dāng)事件發(fā)生后退出 |
-r | 遞歸監(jiān)控當(dāng)前目錄下的所有文件和目錄.(默認的文件和目錄數(shù)最大是 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> | 輸出指定內(nèi)容格式. |
--timefmt <fmt> | 指定輸出時間格式 |
-t <seconds> | 超時時間. |
-e <event1> <event2> ... ] | 指定監(jiān)視事件. |
事件說明
事件 | 說明 |
---|---|
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
查看.
解決方案
當(dāng)前目錄下生成 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
監(jiān)視腳本:
#!/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文件系統(tǒng)事件監(jiān)控框架
-
為了避免發(fā)布人員將debug版本發(fā)到外網(wǎng),我們內(nèi)網(wǎng)使用的都是release版本的程序,編譯完成之后分離出符號表 ?