Как использовать и максимально эффективно использовать команду fuser в Linux
На этой странице
- Команда фьюзера Linux
- Как завершить процесс с помощью фьюзера
- фьюзер – другие сведения
- Заключение
Предположим, вам дали задание определить процессы, использующие тот или иной файл, а затем убить их один за другим — все это нужно делать из командной строки. Что бы ты сделал? Что ж, если вы новичок в командной строке, я уверен, что вы будете невежественны, если будете просить помощи.
Но профессионалы командной строки, скорее всего, догадаются, что в Linux существует утилита командной строки, позволяющая идентифицировать процессы на основе файлов (или каталогов, или сокетов), к которым они обращаются. Мало того, этот инструмент также позволяет вам убивать эти процессы, поэтому вам не нужно использовать команды kill или killall по отдельности. Утилита командной строки, о которой мы говорили, это fuser.
Если вы еще не знакомы с этой утилитой и хотите понять, как ее использовать, не смотрите дальше, так как в этой статье мы подробно обсудим fuser с помощью нескольких простых для понимания примеров.
Но прежде чем мы двинемся дальше, имейте в виду, что все примеры, команды и инструкции, упомянутые в этом руководстве, были протестированы на Ubuntu 16.04 LTS, а версия команды fuser, которую мы использовали, — 22.21.
Команда фьюзера Linux
Команда fuser, как я уже упоминал выше, в основном используется для идентификации процессов, использующих файлы, каталоги или сокеты. Инструмент в основном отображает PID процессов, которые используют файл, имя которого передается в качестве аргумента команде.
Вот команда fuser в действии в самой простой форме:
Как видно из приведенного выше снимка экрана, мы попытались использовать fuser, чтобы узнать, какие процессы используют каталог /home/himanshu, и команда — в своем выводе — создала список идентификаторы процессов. Пока все хорошо, но есть пара проблем.
Во-первых, что это за c добавлено к каждому PID? Беглый взгляд на справочную страницу команд показывает, что в режиме отображения по умолчанию команда fuser не только отображает PID процессов, обращающихся к файлу или каталогу, но также отображает тип доступа.
Каждый тип доступа обозначается буквой:
- c - текущий каталог.
- e - исполняемый файл запущен.
- f - открыть файл. f опущен в режиме отображения по умолчанию.
- F - открыть файл для записи. F опущен в режиме отображения по умолчанию.
- r - корневой каталог.
- m — файл mmaped или общая библиотека.
Теперь, возвращаясь к примеру, который мы обсуждали, буква c в выводе указывает на то, что все процессы, PID которых перечислены в выводе, обращаются к каталогу /home/himanshu как к своему текущему каталогу.
Имейте в виду, что процесс может иметь несколько типов доступа к файлу или каталогу. Например, следующий вывод показывает, что корневой каталог (/) используется многими процессами как их текущий, так и корневой каталог.
До сих пор выходные данные fuser содержали только идентификаторы процессов и ничего более. Не будет ли лучше, если имена процессов также будут отображаться? Что ж, для этого вам нужно использовать параметр командной строки -v. Ниже приведен пример:
Двигаясь дальше, чтобы добавить имя пользователя владельца процесса к каждому PID, используйте параметр командной строки -u. Вот пример для этого:
Примечание. Если рассматриваемый файл или каталог находится в смонтированной файловой системе или на блочном устройстве, используйте параметр командной строки -m. «Все процессы, обращающиеся к файлам в этой файловой системе, перечислены», — говорится в справочной странице. \Если указан файл каталога, он автоматически изменяется на ИМЯ/., чтобы использовать любую файловую систему, которая может быть смонтирована в этом каталоге.\
Как убить процессы с помощью фьюзера
Теперь, когда мы обсудили основы fuser, давайте перейдем к задаче, которую я упомянул в начале — как убить процессы с помощью fuser? Давайте возьмем более простой пример для этого случая. Что я сделаю, так это запущу исполняемый файл и во время его работы попытаюсь убить процесс с помощью fuser.
Итак, вот исполняемый файл, который был запущен:
А вот команда fuser, которая в идеале должна убить процесс, инициированный исполняемым файлом test-fuser.
fuser -v -k test-fuser
О, прежде чем я продолжу и выполню эту команду, позвольте мне сказать вам, что параметр командной строки -k указывает fuser завершить процесс (или процессы), используя файл или каталог.
Вот что произошло, когда была выполнена вышеупомянутая команда:
Как видно из приведенного выше снимка экрана, использование параметра командной строки -k с fuser привело к завершению процесса test-fuser. Чтобы убедиться, что команда fuser запрашивает у пользователей подтверждение перед завершением процесса, используйте параметр -i. См. пример ниже:
Ниже приведены несколько важных деталей, связанных с фьюзером, которые вы должны знать при использовании параметра -k:
- С параметром -k команда fuser по умолчанию отправляет сигнал SIGKILL. Но вы можете изменить это поведение с помощью параметра -SIGNAL.
- Процесс фьюзера никогда не завершает работу, но может завершать работу других процессов фьюзера.
фьюзер - другие детали
Помимо информации, упомянутой до сих пор, есть несколько других деталей, о которых стоит помнить. Доступ ко всей этой информации можно получить, перейдя на справочную страницу команд. Например, ниже приведена информация, которую справочная страница fuser перечисляет в разделе «Ограничения»:
Processes accessing the same file or file system several times in the
same way are only shown once.
If the same object is specified several times on the command line, some
of those entries may be ignored.
fuser may only be able to gather partial information unless run with
privileges. As a consequence, files opened by processes belonging to
other users may not be listed and executables may be classified as
mapped only.
Installing fuser SUID root will avoid problems associated with partial
information, but may be undesirable for security and privacy reasons.
udp and tcp name spaces, and UNIX domain sockets can't be searched with
kernels older than 1.3.78.
Accesses by the kernel are only shown with the -v option.
The -k option only works on processes. If the user is the kernel,
fuser will print an advice, but take no action beyond that.
Заключение
Как вы уже поняли, fuser — чрезвычайно полезная утилита командной строки в Linux. Хорошо то, что этот инструмент не сложен ни для понимания, ни для использования, поэтому даже новички могут легко начать с ним работать. Один аспект, который мы здесь не затронули, заключается в том, что эта команда позволяет вам идентифицировать и даже уничтожать процессы, запущенные на определенных портах, что делает ее трудно игнорировать и для сетевых администраторов.