如何在 sh 文件工作但被删除时读取它?

gaz*_*len 20 command-line bash

在一次采访中,他们问了我这个问题。

有一个 sh 文件已经在运行,但它在开始执行后已被删除。

他们要我找到进程并阅读文件。

我设法找到了过程

ps -ef | grep test.sh
Run Code Online (Sandbox Code Playgroud)

并尝试通过使用阅读它

cat /proc/PID/cmdline test.sh
Run Code Online (Sandbox Code Playgroud)

但它说

no such file or directory
Run Code Online (Sandbox Code Playgroud)

我不知道接下来应该做什么,所以我不得不跳过这个。

也许这是一个简单的问题,但这对我来说确实是一个好问题,我真的很想知道答案。你们能帮忙吗?

Rin*_*ind 24

tail -c +0 -f /proc/{pid}/fd/{fd} > /tmp/file
Run Code Online (Sandbox Code Playgroud)

其中 {pid} 是您的进程的 ID,/tmp/file并将包含其内容。如果您想保留它,请使用其他位置和名称。

  • {pid} 是进程的 ID。
  • {fd} 是文件描述符。lsof应该显示 fd。lsof也可能会在线上显示“已删除”,因此您也可以grep这样做。lsof -nP +L1将列出所有链接少于 1 的文件,删除的文件将有 0。添加一个| grep {pid}以仅搜索您的 PID。
  • 来自甜点:lsof -p 22664 | sed -E '$!d;s/.*\s([0-9]+)[a-z]\s.*/\1/'只是得到 fd。
  • 来自评论:您可以使用less,cat或者cp也可以。我长大了tail:)