Не удается увидеть файлы, открытые процессом - PullRequest
0 голосов
/ 08 ноября 2018

Я знаю, что могу использовать lsof -p или ls / proc // fd для вывода списка файлов, открытых процессом.

Однако, мой вопрос, давайте предположим, что у меня запущен скрипт bash, который обращается к определенному файлу X.

Когда я запускаю скрипт bash и выполняю lsof -p или ls / proc // fd, я вижу имя скрипта bash как один из файлов, открытых процессом.

Есть ли способ перечислить файл X здесь или каким-либо другим способом, который скажет мне, что файл X был доступен здесь?

1 Ответ

0 голосов
/ 08 ноября 2018

Текстовое приключение:

$ 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 и его потомки , скрипт и команда в скрипт (плюс 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
...