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

Команда fuser – очень умная утилита Unix, которая определяет, какой процесс использует файл, каталог или сокет. Также она может предоставить информацию о типе доступа и пользователе, которому принадлежит процесс. Утилита fuser выводит id процесса (или PID) при помощи заданного файла или файловой системы.

Как работает утилита fuser?

Чтобы вывести на экран страницу мануала для любой нужной команды, можно использовать команду man. Но знакомиться с командами Linux лучше на живых примерах. Запустите в терминале следующую команду, чтобы получить информацию об опциях fuser. В данном руководстве работа утилиты fuser продемонстрирована на Ubuntu 12.04, но эта команда действительна для любого современного дистрибутива Linux.

fuser
root@exampleuser-X55CR:~# fuser
No process specification given
Usage: fuser [-fMuv] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...
fuser -l
fuser -V
Show which processes use the named files, sockets, or filesystems.
-a,--all              display unused files too
-i,--interactive      ask before killing (ignored without -k)
-k,--kill             kill processes accessing the named file
-l,--list-signals     list available signal names
-m,--mount            show all processes using the named filesystems or block device
-M,--ismountpoint     fulfill request only if NAME is a mount point
-n,--namespace SPACE  search in this name space (file, udp, or tcp)
-s,--silent           silent operation
-SIGNAL               send this signal instead of SIGKILL
-u,--user             display user IDs
-v,--verbose          verbose output
-w,--writeonly        kill only processes with write access
-V,--version          display version information
-4,--ipv4             search IPv4 sockets only
-6,--ipv6             search IPv6 sockets only
-                     reset options
udp/tcp names: [local_port][,[rmt_host][,[rmt_port]]]

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

Запущенная с опцией –v, утилита fuser будет работать в подробном режиме; это значит, что команда будет выводить подробный результат, благодаря чему пользователь сможет наблюдать действие утилиты в реальном времени.

root@exampleuser-X55CR:~# fuser -v .
USER        PID ACCESS COMMAND
/root:               root       3378 ..c.. vim
root       3398 ..c.. bash
root       3449 ..c.. bash
root      19370 ..c.. bash
root@exampleuser-X55CR:~#

Вышеприведенный вывод показывает, что запущенная в подробном режиме утилита fuser выводит информацию в столбцах: USER, PID, ACCESS и COMMAND. Символ «с» в столбце ACCESS показывает тип доступа и значит «current directory». Существует несколько типов доступа:

  • e – executable (исполняемый файл),
  • r – root directory’ (root-каталог),
  • f – open file (открытый файл; f отсутствует в стандартном режиме),
  • F – open file for writing (файл, открытый для записи; в стандартном режиме F отсутствует),
  • m – mmap file or shared library (файл mmap или совместно используемая библиотека).

Какой процесс использует tcp- или udp-сокет?

Иногда процессы просматриваются при помощи сокетов TCP и UDP. Для этого существует опция -n, которая используется для выбора соответствующего пространства имен. К примеру, следующая команда создает прослушивание TCP на порт 80.

root@exampleuser-X55CR:~# nc -l -p 80
Since a tcp server is listening on port 80, the fuser utility can be used to find the process which is using the server’s socket. The -v option is used to put the fuser utility in verbose mode and the -n option is used to select the tcp protocol as a name space.
root@exampleuser-X55CR:~# fuser -v -n tcp 80
root@exampleuser-X55CR:~# fuser -v -n tcp 80
USER        PID ACCESS COMMAND
80/tcp:              root       3846 F.... nc
root@exampleuser-X55CR:~#

По умолчанию инструмент fuser просматривает сокеты IPv6 и IPv4, но это поведение можно изменить при помощи опций -4 (для IPv4) и -6 (для IPv6). Имейте в виду: fuser выводит в stdout только PID, всё остальное отправляется в stderr.

Результаты команды «fuser -v -n tcp 80» показывают, что id процесса, использующего netcat – 3846, и что этот процесс запущен при помощи команды nc. PID можно использовать несколькими способами, один из которых – уничтожение процесса. Команда kill прерывает процесс с заданным PID. Кроме того, утилита fuser может прерывать процессы через определённый файл; для этого используется опция –k (смотрите пример ниже), которая позволяет остановить процесс при помощи tcp на порте 123. Чтобы предотвратить случайное уничтожение процесса, используется опция –i, которая запрашивает подтверждение.

root@exampleuser-X55CR:~# fuser -k  123/tcp
123/tcp:             11543

Таким образом, команда fuser –k, запущенная с опцией –i, требует подтверждения для прерывания процесса. Чтобы подтвердить, введите y или yes; чтобы отменить прерывание процесса, введите N.

root@exampleuser-X55CR:~# fuser -i -k 123/tcp
123/tcp:             12216
Kill process 12216 ? (y/N)
Use The -6 Option To Look For IPv6 Sockets.

Следующая команда использует инструмент fuser в подробном режиме и ищет сокеты IPv6, запущенные на поре 123.

root@exampleuser-X55CR:~# fuser -v -n tcp -6 123
Since there is no IPv6 socket running on port 123, the command does not produce any output. The -6 option can be replaced with the -4 option in order to search for IPv4 sockets running on a specific port.

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

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

Следующая команда отображает все процессы, обращающиеся к файловой системе, в которой находится тестовый файл example.txt.

root@exampleuser-X55CR:~# fuser -v -m example.txt
USER        PID ACCESS COMMAND
/root/example.txt:   root     kernel mount /
root          1 Frce. init
root          2 .rc.. kthreadd
root          3 .rc.. ksoftirqd/0
root          6 .rc.. migration/0
root          7 .rc.. watchdog/0
[...] exampleuser   23347 .r.e. gcalctool
exampleuser   24527 f..e. chrome
exampleuser   25388 f..e. chrome
exampleuser   25628 .r.e. evince
exampleuser   25634 .rce. evinced
exampleuser   25706 .rce. gm-notify
exampleuser   25769 .rce. at-spi-bus-laun
exampleuser   28191 .rce. mate-settings-d
exampleuser   28193 .rce. mate-screensave
exampleuser   29942 f..e. chrome
exampleuser   30044 .r.e. evince
exampleuser   32721 f..e. chrome

Утилита fuser может также посылать процессам определенные сигналы. К примеру, запущенная с флагом –k, она отправляет процессу сигнал KILL.

Существует множество сигналов, которые можно отправить определенному запущенному процессу; опция -l выводит список сигналов, которые могут быть отправлены инструментом fuser.

root@exampleuser-X55CR:~# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

Этот вывод показывает все сигналы, доступные fuser.

Заключение

Конечно, эта статья не может охватить всех возможностей и привести все примеры использования утилиты fuser. Однако этих базовых знаний и навыков работы с fuser достаточно для начала.

Tags: , , , ,

Добавить комментарий