找出哪个进程正在改变一个文件

我试图find一种可靠的方式来find我的机器上的哪个进程正在改变一个configuration文件( /etc/hosts是特定的)。

我知道我可以使用lsof /etc/hosts来找出当前有哪些进程打开了这个文件,但是这并没有帮助,因为这个进程显然是打开文件,写入文件,然后再closures文件。

我也看了lsof的重复选项(-r),但似乎只有一秒钟一样快,这可能永远不会捕获进行中的写入。

我知道有几个工具可以监视文件系统的变化,但是在这种情况下,我想知道哪个进程是负责任的,这意味着要在动作中捕捉进程。

你可以使用审计来find这个。 如果尚不可用,请为您的发行版安装和启用审计。

在/ etc / hosts上设置审计监视

 /sbin/auditctl -w /etc/hosts -p war -k hosts-file -w watch /etc/hosts -p warx watch for write, attribute change, execute or read events -k hosts-file is a search key. 

等到主机文件发生变化,然后使用ausearch来查看logging的内容

 /sbin/ausearch -f /etc/hosts | more 

你会得到大量的输出,例如


time-> Wed Oct 12 09:34:07 2011 type = PATH msg = audit(1318408447.180:870):item = 0 name =“/ etc / hosts”inode = 2211062 dev = fd:00 mode = 0100644 ouid = 0 ogid (1318408447.180):0 = rdev = 00:00 obj = system_u:object_r:etc_t:s0 type = CWD msg = audit c000003e syscall = 2 success = yes exit = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c items = 1 ppid = 7259 pid = 7294 au id = 1001 uid = 0 gid = 0 euid = 0 suid = 0 fsuid = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm =“touch” exe =“/ bin / touch” subj = user_u:system_r:unconfined_t:s0 key =“hosts-file”


在这种情况下,我使用触摸命令来更改文件timstamp它的pid是7294,它的ppid是7259(我的shell)。

您也可以使用inotify-tools:

  inotifywait -mq -e open -e modify /etc/hosts 

经过大量的search,我find了解决scheme,只需使用这个命令: sudo fs_usage | grep [path_to_file] sudo fs_usage | grep [path_to_file]

可能更好使用像incron然后

http://inotify.aiken.cz/?section=incron&page=about&lang=en

然后你可以让它触发一个脚本来解决某些问题