b2-osx108v8-01:~ bamboo$ lsof -p 264
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
<lines removed>
java 264 bamboo 20w REG 1,2 240906 14883372 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML/SimbaProcessManager.log.0
<lines removed>
该/Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML
目录已被删除,但该文件仍然由我们的守护进程打开。我怎样才能看到这个日志呢?在 Linux 上,我会使用/proc/264/fd/20
,但这似乎在 OSX 上不可用。
答案1
<编辑>
如果这是 Linux,你还可以使用一个gdb
技巧。但事实证明我们可以在 OS X 上排除这个技巧,因为它依赖于/dev/fd/
( /proc/self/fd/
) 的 Linux 特定行为。
我知道的就这些,没有什么积极的建议。
</编辑>
它可能会变得非常可怕,但你考虑过吗gdb
?一个包中的两个奇迹:一个 C 解释器,以及一种将代码注入到您选择的进程中的方法!显然你也可以用它来调试。
幸运的是,C 标准库还包含一个解释脚本的函数。您的平台上的脚本语言可能比 C 更方便编写...
我想到了一个用于less
OS X 的脚本。这是一个脆弱的 hack,可以根据以下内容返回日志文件的开头OS X、bash:较少对打开的文件描述符起作用,而 cat 则不然使用 读取整个日志文件后less
,FD 位置应该位于文件末尾,这希望是我们干预之前的原始位置。
<编辑>但只有当文件也被打开以供读取时它才有效。根据您的lsof
输出,该文件仅打开用于写入。</EDIT>
gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF
我转换了返回类型,因为否则我的系统会抱怨它不知道 的返回类型system()
。想必这也意味着它也不确定参数类型,所以这听起来已经是一个好主意了。
当我在我的 Linux 机器上尝试使用system()
它来操作文件描述符时,它以某种方式起作用了......一次。我不保证它永远有效:)。例如,从技术上讲,如果程序正在执行信号处理程序或其system()
本身,则不能保证这是安全的。 (system()
不是保证“可重入”的少数函数之一)。
答案2
我还没有验证icat
在块设备上操作时行为是否正确,也没有验证 Mac OS 有块设备,也没有验证执行以下操作是否会吃掉您的数据。
或许可以使用icat /dev/MY-DEVICE 14883372
.该icat
命令由 The Sleuth Kit® (TSK) 提供。
https://github.com/sleuthkit/sleuthkit/wiki/HFS
(您已经提到了 Linux。这个想法的灵感来自debugfs
,它有一个命令可以对 Linux 文件系统 ext2/ext3/ext4 执行相同的操作)。