2010-01-19 16:08:15 +0000 2010-01-19 16:08:15 +0000
127
127

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

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

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

Ответы (4)

146
146
146
2010-01-19 16:18:03 +0000

На большинстве систем Linux lsof NAME делает свою работу:

fin@r2d2:~$ 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
fin@r2d2:~$
56
56
56
2010-01-19 17:37:11 +0000

Вы также можете использовать 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
9
9
9
2010-01-20 13:14:12 +0000

Открытие файла не является блокировкой, потому что если каждый процесс сначала должен проверить, открыт ли файл, а если нет, то два процесса вполне могут проверить одновременно, оба обнаруживают, что файл не открыт, затем оба создают или открывают его.

Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть одной непрерывной операцией. Этого можно добиться в файловой системе Unix, создав файл в режиме только для чтения и удалив его для разблокировки. Если файл существует (и только для чтения), то создание файла будет неудачным, поэтому вы получаете check-and-lock за одну атомарную операцию.

Если ваш процесс блокировки является сценарием оболочки, который будет выполняться как демон, вы можете получить этот эффект, используя umask, настройку для каждого процесса, которая устанавливает права, что новые файлы создаются с:

oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask

Это также записывает PID процесса владения в файл, что решает другую вашу проблему: cat /var/lock/foo


Что касается конкретного вопроса “Какие процессы имеют этот файл открыт? ”, это может быть полезно, когда вы хотите размонтировать файловую систему, но не можете, потому что в каком-то процессе есть открытый файл. Если у вас нет этих команд, вы можете спросить /proc как root:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

или, как смертный пользователь:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'

2
2
2
2015-10-30 14:21:35 +0000

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

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

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

Похожие вопросы

6
10
5
37
6