看不到进程打开的文件
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
我知道我可以使用 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