看不到进程打开的文件

Cannot see files opened by a process

我知道我可以使用 lsof -p 或 ls /proc//fd 列出进程打开的文件。

但是,我的问题是,假设我有一个 bash 脚本 运行ning 正在访问某个文件 X。

当我 运行 bash 脚本并执行 lsof -p 或 ls /proc//fd 时,我看到 bash 脚本名称是打开的文件之一过程。

是否可以在此处列出文件 X 或通过任何其他方式告诉我文件 X 已在此处访问?

文字冒险:

$ cd "$(mktemp --directory)"
$ touch input.txt
$ cat > test.sh <<EOF
> #!/usr/bin/env bash
> tail -f input.txt
> EOF
$ chmod u+x test.sh
$ ./test.sh &
[1] 921
$ ps --forest -g $(ps -o sid= -p $!) w
  PID TTY      STAT   TIME COMMAND
  574 pts/4    Ss     0:00 bash
  921 pts/4    S      0:00  \_ bash ./test.sh
  927 pts/4    S      0:00  |   \_ tail -f input.txt
  984 pts/4    R+     0:00  \_ ps --forest -g 574 w

因此您可以看到,当您 运行 一个包含读取文件的命令的脚本时,实际上涉及三个进程:交互式 Bash 会话及其 descendants,脚本,以及脚本中的命令(加上 ps 我们只是 运行)。

因此,如果您想了解脚本使用的文件,您要么必须使用至少一个 ps 命令访问这些文件。但是,如果您只想知道 哪个程序正在访问 特定的 文件 ,您可以直接询问 lsof

$ lsof input.txt 
COMMAND PID          USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
tail    927      username    3r   REG   0,45        0 2047211 input.txt