Поиск по сайту:

Как использовать и максимально эффективно использовать команду fuser в Linux


На этой странице

  1. Команда фьюзера Linux
  2. Как завершить процесс с помощью фьюзера
  3. фьюзер – другие сведения
  4. Заключение

Предположим, вам дали задание определить процессы, использующие тот или иной файл, а затем убить их один за другим — все это нужно делать из командной строки. Что бы ты сделал? Что ж, если вы новичок в командной строке, я уверен, что вы будете невежественны, если будете просить помощи.

Но профессионалы командной строки, скорее всего, догадаются, что в 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. Хорошо то, что этот инструмент не сложен ни для понимания, ни для использования, поэтому даже новички могут легко начать с ним работать. Один аспект, который мы здесь не затронули, заключается в том, что эта команда позволяет вам идентифицировать и даже уничтожать процессы, запущенные на определенных портах, что делает ее трудно игнорировать и для сетевых администраторов.