В Linux команда fuser
(Find USER) — лучший инструмент управления процессами, который идентифицирует процессы, использующие файл, каталог или сокет.
Команда 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
выполняет довольно важные функции. Уметь пользоваться ей крайне желательно.