Как узнать, какой процесс использует файл в Linux?

92

Я попытался удалить файл в Linux с помощью rm -rf file_name, но получил ошибку:

rm: file_name not removed.  Text file busy

Как я могу узнать, какой процесс использует этот файл?

крис
источник

Ответы:

137

Вы можете использовать fuserкоманду, например:

fuser file_name

Вы получите список процессов, использующих файл.

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

Дополнительную информацию можно найти в статье Википедии о фьюзере или на manстраницах.

jimm-cl
источник
Я пробовал это: fuser -i / home / bin / lib. Но получилось так: термоблок: незаконный вариант - я / дом / bin / LIB: 27674t
Khris
1
@khris, может быть, не все fuserреализации одинаковы или работают одинаково. Даже если -iон определен в POSIX, конкретная реализация, которую вы используете, не обязательно имеет те же параметры, что описаны в статье в Википедии. Например, я использую AIX прямо сейчас, и fuserдоступный в этой системе параметр также не имеет этой -iопции.
jimm-cl
По какой-то причине fuserни lsofу меня , ни у меня не работал гостевой виртуальный бокс. Этот ответ меня спас.
kael
34

Ответ @jim правильный - fuserэто то, что вы хотите.

Дополнительно (или в качестве альтернативы) вы можете использовать lsofдля получения дополнительной информации, включая имя пользователя, если вам нужно разрешение (без необходимости запускать дополнительную команду), чтобы убить процесс. (Хотя, конечно, если вы хотите убить процесс, вы fuserможете сделать это с его -kопцией. Вы можете fuserиспользовать другие сигналы с -sопцией - подробности смотрите на странице руководства.)

Например, при tail -F /etc/passwdзапуске в одном окне:

ghoti@pc:~$ lsof | grep passwd
tail      12470    ghoti    3r      REG  251,0     2037 51515911 /etc/passwd

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

гхоти
источник
в каком поле находится PID?
nmz787
@ nmz787 - lsof | head -1чтобы увидеть все заголовки.
Ghoti
@ nmz787 Второе поле - это PID.
Forthe
lsof | grep -E "PID|<your_process_name>"показывает как 1-ю строку, так и процесс, который вы хотите запросить.
Робин Сюй,
0
$ lsof | tree MyFold

Как показано на прилагаемом изображении:

введите описание изображения здесь

Тупое понятие
источник
1
Как это работает? Читает treeчто-нибудь из stdin? Если да, что он делает с этим вводом?
Дип
man lsof - отображает руководство для команды lsof, lsof - выводит список открытых файлов, перечисляет в своем стандартном выходном файле информацию о файлах, открытых процессами, и результаты, которые можно увидеть в древовидной структуре. вы должны четко проверить, что такое lsof
Blunt Notion
Мой вопрос не о treeтом lsof. Насколько я понимаю, treeне читает со стандартного ввода, поэтому вывод lsofбудет отброшен при запуске lsof | tree .... Если это правильно, то lsof | tree MyFoldэто то же самое tree MyFold, что просто отображает содержимое, но не файлы, открытые каким-либо процессом.
Дип