我知道我可以使用lsof -p或ls / proc // fd列出进程打开的文件。
但是,我的问题是,假设我有一个正在运行的bash脚本正在访问某个文件X。
当我运行bash脚本并执行lsof -p或ls / proc // fd时,我看到bash脚本名称是该进程打开的文件之一。
是否有在这里列出文件X或通过其他任何方式告诉我在这里已访问文件X?
答案 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