it-swarm-ru.tech

Как я могу определить, какой процесс имеет файл, открытый в Linux?

Я хотел бы определить, какой процесс владеет файлом блокировки. Файлы блокировки - это просто файл с определенным именем, которое было создано.

Итак, как я могу определить, какой процесс имеет определенный файл, открытый в Linux? Предпочтительно однострочник или конкретное инструментальное решение для Linux будет оптимальным.

119
Danny

Вы также можете использовать fuser для этого:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc
53
Nathan Fellman

В большинстве систем Linux lsof NAME выполняет свою работу:

[email protected]:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
[email protected]:~$
140
fin

Если вы хотите узнать, какой дескриптор файла процесса ссылается на ваш файл без lsof или fuser - выполните поиск по /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

Замените $1 открытым именем файла, которое вы ищете. Вы можете изменить -printf для того, что вы хотите увидеть, или передать egrep -o '[0-9]+' | head -1 для использования с ps -Fp <pid> для информации этого процесса.

Ответ $ lsof <filename> от @fin, очевидно, является лучшим ответом, но для ответа комментарий @ JoseLSegura , если его нет в наличии, решением выше был мой ответ.

4
5upa

Я обнаружил, что при использовании принятого ответа не было перечислено процессов, которые использовали мой каталог (ubuntu 14.04).

В конце концов, я использовал lsof (список открытых файлов) и набрал его вывод, чтобы найти процесс, вызывающий ошибку:

lsof | egrep "<regexp-for-your-file>"
2
Eosis