i在两个单独的终端上执行了以下操作:
1S术语:
启动过程正在写入后台文件:
└──> while true; do date >> log; sleep 1; done &
[1] 20604
获取在后台运行的最后一个过程的pid:
└──> echo $!
20604
第二项:
显示正在编写的文件的内容:
└──> tail -f log
Thu May 7 18:48:20 CEST 2015
Thu May 7 18:48:21 CEST 2015
Thu May 7 18:48:22 CEST 2015
Thu May 7 18:48:23 CEST 2015
Thu May 7 18:48:24 CEST 2015
Thu May 7 18:48:25 CEST 2015
Thu May 7 18:48:26 CEST 2015
Thu May 7 18:48:27 CEST 2015
第1项:
检查谁在访问文件(请注意,只有读者)
└──> lsof log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 21038 wakatana 3r REG 8,1 5340 797966 log
遵循kill
之后,第二端子上的tail -f
终止,lsof
返回空输出:
└──> kill 21038
└──> lsof log
└──>
第二项:
然后我再次启动tail -f
,然后看到数据仍然写入日志文件。这意味着某些过程仍在写入日志文件:
└──> tail -f log
Thu May 7 18:52:33 CEST 2015
Thu May 7 18:52:34 CEST 2015
Thu May 7 18:52:35 CEST 2015
Thu May 7 18:52:36 CEST 2015
Thu May 7 18:52:37 CEST 2015
Thu May 7 18:52:38 CEST 2015
Thu May 7 18:52:39 CEST 2015
Thu May 7 18:52:40 CEST 2015
在这种情况下,我实际上知道要归档的过程的神秘PID,它是PID 20604,因此我可以杀死它,而日志文件将停止生长。
我的问题是:
- 为什么不显示
lsof
(即使反复发出)实际写作的过程日志文件?我知道20604属于bash
,而不是直接写入文件的bash,而是date
。但是lsof
没有显示bash
和date
。 - 如果我不知道PID 20604怎么办?我该如何跟踪写作过程?
ps:使用的外壳:gnu bash,版本4.2.37(1)-Release(x86_64-pc-linux-gnu)
您有一个经典的工程问题,以的形式异步采样此处。
本质上,每个长期等待时间,一个过程都会很快旋转,写入文件,然后死亡。
与此完全异步,您正在运行查找打开文件的lsof
- 但只有在及时有效地有效地,当文件写入文件时,可能不会匹配 。(实际上,lsof
执行了多步操作,但是可能只有一击的机会来抓住任何给定的 writer)。
可能很容易想到,如果您在循环中运行了足够多的lsof
,您最终会在ACT中抓住作家 - 也许您会的。但是,根据您的系统调度程序和I/O功能的工作方式,写作过程可能是如此简短,以至于在此过程中再也没有机会运行。
如果您想要一个可以在该法中捕获的版本,请继续在括号的子壳中及时将一代人及时及格,但要使写作一致的操作:
(while true; do date ; sleep 1; done) > log &
或,如果您想尝试捕捉简短的事件,则可以查看inotify
机制(可以使用man inotify
查看其文档),请记住没有对演员的识别,而演员的短暂生活像这样,您不能去做lsof
类型搜索以找出它是谁。
感谢https://unix.stackexchange.com/questions/99074/find-prind-process-is-is-is-modifying-a-file
使用auditctl -w /path/to/that/file -p wa
在/var/log/audit/audit.log
中记录文件写作
找到一些字段,例如ppid
。
最后,我们发现谁在写我们的文件。