![找出哪个进程正在更改文件](https://linux22.com/image/564192/%E6%89%BE%E5%87%BA%E5%93%AA%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%AD%A3%E5%9C%A8%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6.png)
我正在尝试找到一种可靠的方法来查找我的机器上哪个进程正在更改配置文件(/etc/hosts
具体来说)。
我知道我可以用它lsof /etc/hosts
来找出当前打开该文件的进程,但这没有帮助,因为该进程显然正在打开该文件,写入文件,然后再次关闭它。
我还查看了lsof
重复选项(-r),但它似乎只能每秒一次,这可能永远无法捕获正在进行的写入。
我知道有几个用于监视文件系统变化的工具,但在这种情况下,我想知道哪个进程负责,这意味着要捕获它的动态。
答案1
您可以使用审核来查找此信息。如果尚不可用,请为您的发行版安装并启用审核。
在 /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.
等到 hosts 文件发生变化,然后使用 ausearch 查看记录的内容
/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=0 rdev=00:00
> obj=system_u:object_r:etc_t:s0 type=CWD msg=audit(1318408447.180:870):
> cwd="/home/iain" type=SYSCALL msg=audit(1318408447.180:870):
> arch=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"
在这种情况下,我使用 touch 命令来更改文件 timstamp,它的 pid 是 7294,它的 ppid 是 7259(我的 shell)。
答案2
经过大量搜索,我找到了解决方案,只需使用这个命令:sudo fs_usage | grep [path_to_file]
答案3
您还可以使用 inotify-tools:
inotifywait -mq -e open -e modify /etc/hosts