我如何知道某个进程打开了哪些文件?

我如何知道某个进程打开了哪些文件?

我有一个守护进程,我想知道它打开了哪些文件(理想情况下,它的 CWD 是什么)。有没有 shell 命令可以告诉我这些?

答案1

我确实喜欢lsof,但我认为对于像这样的简单问题来说,这有点过头了。/proc文件系统包含您想知道的所有内容。也许最好举一个例子:

# ps ax|grep tail
 7196 分/4 S+ 0:00 tail -f /var/log/messages
 8773 pts/0 R+ 0:00 grep tail
# ls -l /proc/7196/cwd
lrwxrwxrwx 1 insyte insyte 0 2009-07-29 19:05 /proc/7196/cwd -> /home/insyte
# ls -l /proc/7196/fd
共 0
lrwx------ 1 insyte insyte 64 2009-07-29 19:05 0 -> /dev/pts/4
lrwx------ 1 insyte insyte 64 2009-07-29 19:05 1 -> /dev/pts/4
lrwx------ 1 insyte insyte 64 2009-07-29 19:02 2 -> /dev/pts/4
lr-x------ 1 insyte insyte 64 2009-07-29 19:05 3 -> /var/log/messages

如您所见,该/proc/$PID目录包含一个名为“cwd”的符号链接,该符号链接指向进程的 CWD。对于 中列出的打开的文件描述符也是如此/proc/$PID/fd

层次/proc/$PID结构包含有关所有正在运行的进程的大量信息。值得一看!

答案2

如果你有命令lsof可用 [大多数 *nix 版本都具备此功能] 您可以使用:

lsof -p NNN

列出进程 NNN 打开的文件。我有一段时间没用过 BSD 了,但从记忆中定影器与 lsof 非常相似。

我不确定找到慢性肾脏病但在 Linux 上,cwd 符号链接到该进程的 /proc 目录,即 /proc/NNN/cwd。

答案3

如果你知道进程的 PID,你可以发出一个

lsof | grep YOURPID

快捷又容易记忆。

或者

lsof -c yourprogramexecutable

答案4

这也可能有帮助,使用 proc 文件系统您可以执行以下操作:

readlink proc_sample/proc/<YOUR_PID>/fd/*

不要忘记<YOUR_PID>用所需的进程 ID 进行替换。

相关内容