Команда fuser в Linux

Опубликовано admin - ср, 03/01/2023 - 11:16

В Linux команда fuser (Find USER) — лучший инструмент управления процессами, который идентифицирует процессы, использующие файл, каталог или сокет.

Примеры использования команды fuser в Linux

Команда fuser предоставляет информацию о владельце процесса и типе доступа и завершает рассматриваемые процессы.

Содержание

Синтаксис

fuser [опции] [файл, каталог или сокет]

Опции

-a,-all
Показать также неиспользуемые файлы
-i,--interactive
Спросить подтверждение завершения (игнорировать без -k)
-I,--inode
Всегда использовать иноды для сравнения файлов
-k,--kill
Завершить процессы, обращающиеся к заданному файлу
-l,--list-signals
Показать допустимые имена сигналов
-m,--mount
Показать процессы, использующие указанные файловые системы или блочные устройства
-M,--ismountpoint
Выполнять запрос, только если ИМЯ является точкой монтирования
-n,--namespace ОБЛАСТЬ
Искать в указанном пространстве имён (file, udp или tcp)
-s,--silent
Не выводить сообщения
-u,--user
Показать идентификатор пользователя (uid)
-v,--verbose
Включить подробные сообщения
-w,--writeonly
Завершать только процессы с правом на запись
-V,--version
Показать информацию о версии
-4,--ipv4
Поиск только среди сокетов IPv4
-6,--ipv6
Поиск только среди сокетов IPv6

Установка

Команда fuser входит в состав пакета psmisc, который обычно предустановлен. Если в вашем дистрибутиве он по какой-либо причине отсутствует, то установить его очень просто.

Установка в Ubuntu:

$ sudo apt install psmisc

Установка в Arch Linux:

$ yay -S psmisc

Использование команды fuser в Linux

Поиск процессов в каталоге

Основная роль команды fuser состоит в определении процессов, использующих файлы в определенном каталоге. Например, в корневом:

oleg@mobile:~:$ fuser /
/:                     486rc   495r   503r   504r   511r   548r   549r   568r   574r   582rc   665r   755r  1401r  1437r  1452r  1457r  1459r  1932rc  1978rc 45257r 45275r 45277r 45279r 45283r 45311r 45531r 46223r 67886r 67902r 67971r 74398r
oleg@mobile:~:$ 

Для вывода списка процессов, запущенных в текущем каталоге, используйте точку .:

oleg@mobile:~:$ fuser .
/home/oleg:            495c   503c   504c   511c   548c   549c   568c   574c   665c   755c  1401c  1437c  1452c  1457c  1459c 45257c 45275c 45277c 45279c 45283c 45311c 45531c 46223c 67886c 67902c 67971c 74964c
oleg@mobile:~:$ 

Терминал отображает домашний каталог как текущий. Следовательно, использование пути /home/oleg/ выводит тот же результат:

oleg@mobile:~:$ fuser /home/oleg/
/home/oleg:            495c   503c   504c   511c   548c   549c   568c   574c   665c   755c  1401c  1437c  1452c  1457c  1459c 45257c 45275c 45277c 45279c 45283c 45311c 45531c 46223c 67886c 67902c 67971c 75345c
oleg@mobile:~:$ 

В выходных данных перечислены PID всех процессов, обращающихся к текущему каталогу.

Для получения более удобочитаемого вывода перед указанием каталогом используется опция -v:

oleg@mobile:~:$ fuser -v /home/oleg/  /home/oleg/
                     ПОЛЬЗ-ЛЬ    PID ДОСТУП КОМАНДА
/home/oleg:          oleg        495 ..c.. dwm
                     oleg        503 ..c.. bash
                     oleg        504 ..c.. sakura
                     oleg        511 ..c.. nm-applet
                     oleg        548 ..c.. dbus-daemon
                     oleg        549 ..c.. at-spi-bus-laun
                     oleg        568 ..c.. dbus-daemon
                     oleg        574 ..c.. gvfsd
                     oleg        665 ..c.. at-spi2-registr
                     oleg        755 ..c.. bash
                     oleg       1401 ..c.. gvfs-udisks2-vo
                     oleg       1437 ..c.. gvfsd-trash
                     oleg       1452 ..c.. gvfsd-network
                     oleg       1457 ..c.. dconf-service
                     oleg       1459 ..c.. gvfsd-dnssd
                     oleg      45257 ..c.. bash
                     oleg      45275 ..c.. chromium
                     oleg      45277 ..c.. chrome_crashpad
                     oleg      45279 ..c.. chrome_crashpad
                     oleg      45283 ..c.. chromium
                     oleg      45311 ..c.. chromium
                     oleg      45531 ..c.. chromium
                     oleg      46223 ..c.. chromium
                     oleg      67886 ..c.. bash
                     oleg      67902 ..c.. geany
                     oleg      67971 ..c.. bash
                     oleg      76355 ..c.. sleep
oleg@mobile:~:$

Вывод детализирован и включает следующие столбцы:

ПОЛЬЗОВАТЕЛЬ
Владелец процесса
PID
Идентификатор процесса
ДОСТУП
Тип доступа
КОМАНДА
Команда, выполняющая процесс

В приведенных выше примерах в столбце доступа отображается символ c, обозначающий текущий каталог. Другие типы доступа и символы:

e
Исполняемый файл запущен
f
Открыть файл
F
Файл открыт для записи
р
Корневой каталог
m
Файл mmap или разделяемая библиотека 

Для работы с каталогами других пользователей пользуйтесь sudo. При использовании sudo выводится больше процессов, в том числе принадлежащих пользователю root.

Получение списка процессов с помощью файла

Найдём процессы, обращающиеся к файлу, запустив команду fuser с путём к имени файла. Команда работает и с исполняемыми файлами, например /usr/local/bin/dwm:

oleg@mobile:~:$ fuser -v /usr/local/bin/dwm
                     ПОЛЬЗ-ЛЬ    PID ДОСТУП КОМАНДА
/usr/local/bin/dwm:  oleg        495 ...e. dwm
oleg@mobile:~:$ 

Команда выводит:

oleg
Владелец процесса
PID
Процесса
e
Символ доступа, указывающий на то, что файл является исполняемым
dwm
Команда запуска файла

Поиск процесса, обращающегося к файловой системе

Для идентификации всех процессов, обращающихся к файловой системе, команда fuser используется с флагом -m и указанием файла, принадлежащего этой системе.

Например, для вывода списка всех файлов и процессов, запущенных в файловой системе, к которой принадлежит исполняемый файл dwm, использовавшийся в предыдущем примере, вводится:

oleg@mobile:~:$ fuser -v -m /usr/local/bin/dwm
                     ПОЛЬЗ-ЛЬ    PID ДОСТУП КОМАНДА
/usr/local/bin/dwm:  root     kernel mount /
                     oleg        486 .rce. systemd
                     oleg        495 .r.e. dwm
                     oleg        503 .r.e. bash
                     oleg        504 .r.e. sakura
                     oleg        511 .r.e. nm-applet
                     oleg        548 .r.e. dbus-daemon
                     oleg        549 .r.e. at-spi-bus-laun
                     oleg        568 .r.e. dbus-daemon
                     oleg        574 .r.e. gvfsd
                     oleg        582 .rce. gvfsd-fuse
                     oleg        665 .r.e. at-spi2-registr
                     oleg        755 .r.e. bash
                     oleg       1401 .r.e. gvfs-udisks2-vo
                     oleg       1437 .r.e. gvfsd-trash
                     oleg       1452 .r.e. gvfsd-network
                     oleg       1457 .r.e. dconf-service
                     oleg       1459 .r.e. gvfsd-dnssd
                     oleg       1932 .rce. pulseaudio
                     oleg       1978 .rce. gsettings-helpe
                     oleg      45257 .r.e. bash
                     oleg      45275 .r.e. chromium
                     oleg      45277 .r.e. chrome_crashpad
                     oleg      45279 .r.e. chrome_crashpad
                     oleg      45283 .r.e. chromium
                     oleg      45284 ...e. chromium
                     oleg      45286 ...e. chromium
                     oleg      45311 .r.e. chromium
                     oleg      45319 ...e. chromium
                     oleg      45370 ...e. chromium
                     oleg      45531 .r.e. chromium
                     oleg      45539 ...e. chromium
                     oleg      46223 .r.e. chromium
                     oleg      67886 .r.e. bash
                     oleg      67902 .r.e. geany
                     oleg      67971 .r.e. bash
                     oleg      68086 ...e. chromium
                     oleg      68122 ...e. chromium
                     oleg      69952 ...e. chromium
                     oleg      84107 .r.e. sleep
oleg@mobile:~:$ 

Убить процессы

Команда fuser с опцией -k завершает процессы по выбранному пути во всём каталоге. Для того чтобы убить не все процессы, а лишь конкретный, следует обращаться лишь к конкретному файлу.

Например, при обновлении пакетов Ubuntu можно иногда получить следующее сообщение:

$ sudo apt update 
Ожидание блокировки кэша: Не удалось получить блокировку файла /var/lib/dpkg/lock-frontend. Она удерживается процессом 46h.

В этом случае команда fuser с опциями -vki должна обращаться к файлу /var/lib/dpkg/lock-frontend:

fuser -k /var/lib/dpkg/lock-frontend

Опция -i (интерактивность) позволит работать в диалоговом режиме и покажет завершение процесса.

При отсутствии желания выполнять все указанные действия можно просто перезагрузить систему.

После этого нужно выполнить команду, которая переконфигурирует пакетный менеджер:

$ sudo dpkg --configure -a

Заключение

Из этой статьи следует, что в Linux команда fuser выполняет довольно важные функции. Уметь пользоваться ей крайне желательно.

Поделиться с друзьями