看不到进程打开的文件

时间:2018-11-08 02:48:26

标签: bash file-descriptor lsof

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

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

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

是否有在这里列出文件X或通过其他任何方式告诉我在这里已访问文件X?

1 个答案:

答案 0 :(得分:1)

基于文字的冒险:

$ 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