我在两个单独的终端上做了以下操作:
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
第一学期:
检查谁在访问文件(注意只有读者)
└──> 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 直接写入文件,而是 childdate
。但是lsof
没有显示 也bash
没有date
。 - 如果我不知道 PID 20604 怎么办?那么如何跟踪写作过程呢?
PS:使用的shell:GNU bash,版本 4.2.37(1)-release (x86_64-pc-linux-gnu)