找出哪个进程正在更改文件


35

我试图找到一种可靠的方法来查找机器上的哪个进程正在更改配置文件(/etc/hosts具体来说)。

我知道我可以lsof /etc/hosts用来找出当前打开了哪些进程的文件,但这无济于事,因为该进程显然是在打开文件,写入文件然后再次将其关闭。

我还查看了lsof的重复选项(-r),但它似乎仅以每秒一次的速度运行,这可能永远不会捕获正在进行的写入。

我知道有几个用于监视文件系统更改的工具,但是在这种情况下,我想知道哪个进程负责,这意味着在执行过程中将其捕获。

Answers:


52

您可以使用审核来找到它。如果尚不可用,请安装发行版并启用审核。

在/ 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查看记录的内容

/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成功=是退出= 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c项目= 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
“为发行版启用审核”可能应该扩大一点。烦人的是,以上命令没有给我错误和结果。“ / sbin / auditctl -e 1”也没有帮助。运行审核守护程序来进行日志记录确实有所帮助-“ /etc/init.d/auditd start”(尽管它删除了我的规则,所以我不得不再次输入它们)。
tobixen

对我ausearch<no matches>
没用

1
有时,您可能需要设置多个审核才能获得启动修改的实际流程,例如,如果该流程正在调用外部命令来完成修改工作。即我试图找出为什么用户crontab条目经常被重置。crontab命令是负责任的,但是到我检查它已经退出的ppid时,所以我也必须审核/ usr / bin / crontab,然后将对crontab的访问时间戳与经过审核的crontab执行匹配,然后检查它是ppid ...这表明业务流程守护程序正在执行特定的用户cron配置。
威尔

3

您还可以使用inotify-tools:

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

14
经审核能够为您提供所需的信息。即使很容易假设inotify可以让您做到这一点-不会,因为它不会为您提供进行修改的进程ID。
客观化了

2

经过大量搜索,我找到了解决方案,只需使用以下命令: sudo fs_usage | grep [path_to_file]


2
这仅适用于MacOS ...
majick

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.