gpt4 book ai didi

linux - 谁在写我的文件或者为什么 lsof 没有显示作者但读者显示

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:21 27 4
gpt4 key购买 nike

我在两个不同的终端上执行了以下操作:

1 任期:

启动在后台写入文件的进程:

└──> 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

第一学期:

检查谁在访问文件(注意只有reader)

└──> 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,所以我可以杀死它,日志文件将停止增长。

我的问题是:

  1. 为什么 lsof 不显示(即使重复发出)实际正在写入的进程日志文件?我知道 20604 属于 bash,它不是直接写入文件的 bash,而是子 date。但是 lsof 既没有显示 bash 也没有显示 date
  2. 如果我不知道 PID 20604 怎么办?那么我如何跟踪写作过程?

PS:使用的shell:GNU bash,版本4.2.37(1)-release (x86_64-pc-linux-gnu)

最佳答案

这里有一个异步采样形式的经典工程问题。

基本上,每经过一段长时间的等待,一个进程就会很快启动,写入文件,然后死掉。

与此完全异步,您运行 lsof 以查找打开的文件 - 但仅在某个时刻有效,在写入文件时可能不匹配 . (实际上,lsof 执行多步操作,但可能只有一次机会捕获任何给定 作者)。

如果您在一个循环中运行 lsof 的次数足够多,您可能会很想这样想,您最终会捕获作者的手脚——也许您会的。但是,根据您系统的调度程序和 I/O 功能的工作方式,写入过程可能会如此简短,以致于在此过程中永远不会有任何其他进程运行的机会。

如果你想要一个你可以在行动中捕捉到的版本,继续在带括号的子 shell 中按时间间隔生成,但使写入成为一个一致的操作:

(while true; do date ; sleep 1; done) > log &

或者,如果你想 try catch 简短的事件,你可以查看 inotify 机制(你可以使用 man inotify 查看它的文档)记住没有 Actor 的身份证明,当 Actor 像这样短暂存在时,您就无法进行 lsof 类型的搜索来找出他是谁。

关于linux - 谁在写我的文件或者为什么 lsof 没有显示作者但读者显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30108060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com