Узнать каким процессом занят файл linux

Нужно знать: утилита lsof в Linux

img

В этой статье мы объясним, как узнать, кто использует тот или иной файл в Linux. Это поможет вам узнать системного пользователя или процесс, который использует открытый файл.

Как узнать, кто использует файл в Linux?

утилита lsof в Linux

Мы можем использовать команду lsof (которая является аббревиатурой от List Of Opened Files), чтобы узнать, использует ли кто-то файл, и если да, то кто. Он читает память ядра в поиске открытых файлов и перечисляет все открытые файлы. В этом случае открытый файл может быть обычным файлом, каталогом, специальным файлом блока, специальным файлом символов, потоком, сетевым файлом и многими другими, поскольку в Linux все является файлом.

Lsof используется в файловой системе, чтобы определить, кто использует какие-либо файлы в этой файловой системе. Вы можете запустить команду lsof в файловой системе Linux, и выходные данные идентифицируют владельца и информацию о процессах для процессов, использующих файл, как показано в следующих выходных данных.

Список всех открытых файлов в Linux

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1480 merionet 0r CHR 1,3 0t0 6 /dev/null sh 1501 merionet 0r CHR 1,3 0t0 6 /dev/null sh 1501 merionet 1w CHR 1,3 0t0 6 /dev/null dbus-daem 1530 merionet 0u CHR 1,3 0t0 6 /dev/null xfce4-ses 1603 merionet 0r CHR 1,3 0t0 6 /dev/null xfce4-ses 1603 merionet 1w CHR 1,3 0t0 6 /dev/null at-spi-bu 1604 merionet 0r CHR 1,3 0t0 6 /dev/null dbus-daem 1609 merionet 0u CHR 1,3 0t0 6 /dev/null at-spi2-r 1611 merionet 0u CHR 1,3 0t0 6 /dev/null xfconfd 1615 merionet 0u CHR 1,3 0t0 6 /dev/null xfwm4 1624 merionet 0r CHR 1,3 0t0 6 /dev/null xfwm4 1624 merionet 1w CHR 1,3 0t0 6 /dev/null xfce4-pan 1628 merionet 0r CHR 1,3 0t0 6 /dev/null xfce4-pan 1628 merionet 1w CHR 1,3 0t0 6 /dev/null Thunar 1630 merionet 0r CHR 1,3 0t0 6 /dev/null Thunar 1630 merionet 1w CHR 1,3 0t0 6 /dev/null xfdesktop 1632 merionet 0r CHR 1,3 0t0 6 /dev/null xfdesktop 1632 merionet 1w CHR 1,3 0t0 6 /dev/null .

Чтобы вывести список файлов, открытых для конкретного пользователя, выполните следующую команду: замените merionet вашим именем пользователя.

Список файлов, открытых пользователем:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1480 merionet cwd DIR 8,3 4096 2 / systemd 1480 merionet rtd DIR 8,3 4096 2 / systemd 1480 merionet txt REG 8,3 1595792 3147496 /lib/systemd/systemd systemd 1480 merionet mem REG 8,3 1700792 3150525 /lib/x86_64-linux-gnu/libm-2.27.so systemd 1480 merionet mem REG 8,3 121016 3146329 /lib/x86_64-linux-gnu/libudev.so.1.6.9 systemd 1480 merionet mem REG 8,3 84032 3150503 /lib/x86_64-linux-gnu/libgpg-error.so.0.22.0 systemd 1480 merionet mem REG 8,3 43304 3150514 /lib/x86_64-linux-gnu/libjson-c.so.3.0.1 systemd 1480 merionet mem REG 8,3 34872 2497970 /usr/lib/x86_64-linux-gnu/libargon2.so.0 systemd 1480 merionet mem REG 8,3 432640 3150484 /lib/x86_64-linux-gnu/libdevmapper.so.1.02.1 systemd 1480 merionet mem REG 8,3 18680 3150450 /lib/x86_64-linux-gnu/libattr.so.1.1.0 systemd 1480 merionet mem REG 8,3 18712 3150465 /lib/x86_64-linux-gnu/libcap-ng.so.0.0.0 systemd 1480 merionet mem REG 8,3 27112 3150489 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 systemd 1480 merionet mem REG 8,3 14560 3150485 /lib/x86_64-linux-gnu/libdl-2.27.so .

Еще одно важное использование lsof — выяснение процесса прослушивания определенного порта. Например, определите процесс, прослушивающий порт 80, с помощью следующей команды.

Читайте также:  Qt развертывание приложений linux

Процессы, прослушивающие порт:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 903 root 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 1320 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 1481 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 1482 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 1493 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 1763 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 2027 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 2029 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 2044 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 3199 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN) httpd 3201 apache 4u IPv6 20222 0t0 TCP *:http (LISTEN)

Примечание: поскольку lsof читает память ядра при поиске открытых файлов, быстрые изменения в памяти ядра могут привести к непредсказуемым результатам. Это один из основных недостатков использования команды lsof.

Для получения дополнительной информации, смотрите справку lsof:

На этом все! В этой статье мы объяснили, как узнать, кто использует тот или иной файл в Linux.

Источник

How find out which process is using a file in Linux?

You can use the fuser command, which is part of the psmisc package, like:

You will receive a list of processes using the file.

You can use different flags with it, in order to receive a more detailed output.

You can find more info in the fuser’s Wikipedia article, or in the man pages.

@khris, might be that not all fuser implementations are the same, or works the same way. Even if -i is defined in POSIX, the particular implementation you are using does not necessarily has the same options as the ones described in the Wikipedia article. For example, I’m using AIX right now, and the fuser available in this system does not have the -i option either.

For some reason, neither fuser nor lsof were working for me on a virtualbox guest. This answer saved me.

@jim’s answer is correct — fuser is what you want.

Additionally (or alternately), you can use lsof to get more information including the username, in case you need permission (without having to run an additional command) to kill the process. (THough of course, if killing the process is what you want, fuser can do that with its -k option. You can have fuser use other signals with the -s option — check the man page for details.)

Читайте также:  Intel 9260 driver linux

For example, with a tail -F /etc/passwd running in one window:

ghoti@pc:~$ lsof | grep passwd tail 12470 ghoti 3r REG 251,0 2037 51515911 /etc/passwd 

Note that you can also use lsof to find out what processes are using particular sockets. An excellent tool to have in your arsenal.

Источник

Узнать каким процессом занят файл linux

Библиотека сайта rus-linux.net

fstat . Я, конечно, попытался вызвать эту команду в своей системе на основе дистрибутива ASP Linux 7.3, но такой команды в моей системе не обнаружилось. Команда man fstat сообщила, что есть такой системный вызов fstat , который выдает информацию об указанном файле, но писать собственную утилиту на основе этого системного вызова мне, прямо признаюсь, не по силам.

Сейчас я даже уже и не вспомню, откуда я это знал, но где-то в глубинах подсознания мелькнула мысль, что для решения этой проблемы можно использовать утилиту lsof . Кстати, один из читателей моей книги [3] в своем отзыве на книгу в качестве недостатка указал на то, что эта утилита в книге не описана. Я и решил попытаться применить lsof для решения своей задачи, и начал, естественно, с изучения справки, выдаваемой командой man lsof . А кроме того, поискал информацию в Интернет и нашел статьи 4. Все эти материалы и послужили основой для настоящей статьи.

Для чего служит команда lsof

Относительно lsof справка man как раз сообщает, что lsof есть сокращение от LiSt of Open Files, и что утилита эта служит для вывода информации о том, какие файлы используются теми или иными процессами. Причем утилита эта имеется в очень многих версиях и диалектах UNIX, включая Linux версии 2.1.72 и выше, а также в HP-UX, AIX, NextStep, Apple Darwin для Power Macintosh, SCO UnixWare, Solaris, FreeBSD, NetBDS, OpenBSD и так далее.

Создателем программа lsof является Victor A. Abell, его домашняя страничка расположена по адресу http://people.freebsd.org/~abe/ , где вы можете найти исходные коды программы. Их можно также скачать с FTP-сайта ftp://vic.cc.purdue.edu/pub/tools/unix/lsof. О том, как скомпилировать и установить программу, вы можете прочитать в статье [8].

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

Кстати, если вы будете экспериментировать, имейте в виду, что будучи запущенной простым пользователем, эта команда выдает информацию только о процессах, запущенных этим пользователем. Поэтому во многих случаях вы можете не получить от нее никакого ответа. Если вы хотите получить вразумительный ответ на любой свой запрос, ее необходимо запускать от имени root-а (можно воспользоваться следующей формой запуска sudo lsof ). Кроме того, команда отрабатывает достаточно медленно, так что будьте терпеливы и не щелкайте раньше времени + — программа не зависла, просто идет поиск информации.

Читайте также:  Какую поставить linux mint

А теперь смотрим листинг 1 (или результат работы программы на вашем экране).

Листинг 1. Вывод команды lsof.

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 4096 2 / init 1 root txt REG 3,3 27036 161176 /sbin/init init 1 root mem REG 3,3 103044 160493 /lib/ld-2.3.2.so init 1 root 10u FIFO 3,3 71954 /dev/initctl portmap 1528 rpc 3u IPv4 1656 UDP *:sunrpc xinetd 1649 root 0r CHR 1,3 65970 /dev/null rpc.mount 1682 root 5u unix 0xc34cea80 10311 socket nmbd 1790 root 6u IPv4 2456 UDP *:netbios-ns sh 23252 kos 4u CHR 5,0 70758 /dev/tty sh 23252 kos 6u CHR 136,3 5 /dev/pts/3 sh 23252 kos 8w FIFO 0,5 840800 pipe sh 23253 kos cwd DIR 3,3 4096 160487 /usr/share/man sh 23253 kos rtd DIR 3,3 4096 2 / sh 23253 kos txt REG 3,3 626028 160664 /bin/bash

Как видите, один и тот же процесс открывает много файлов, каждому из которых соответствует строка в выводе lsof . В начале строки указывается имя процесса, его идентификатор, имя пользователя, запустившего процесс. В столбце FD стоит номер файлового дескриптора или одна из следующих буквенных комбинаций (я не берусь корректно перевести на русский язык некоторых из расшифровок этих сокращений, так что привожу их в том виде, как они выдаются справочной системой):

  • cwd — текущий рабочий каталог;
  • ltx — текст разделяемой библиотеки;
  • mxx — hex memory-mapped type number xx.
  • m86 — DOS Merge mapped file;
  • mem — файл, загруженный в память (memory-mapped file), чаще всего – библиотека,
  • mmap — memory-mapped device;
  • pd — родительский каталог;
  • rtd — корневой каталог;
  • txt – текст программы (код и данные);
  • v86 — VP/ix mapped file.
  • r — файл открыт для чтения;
  • w – файл открыт для записи;
  • u — файл открыт для чтения и для записи;
  • пробел – режим доступа неизвестен и файл не блокирован;
  • ‘-’ — режим доступа неизвестен, но на файл установлена блокировка.

Опции команды

Применение команды lsof

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

Пример 1. Кто работает с файлом или каталогом?

[user]$ /usr/sbin/lsof +d /mnt/cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mc 1547 kos cwd DIR 11,0 2048 53248 /mnt/cdrom bash 1556 kos cwd DIR 11,0 2048 53248 /mnt/cdrom

Пример 2. Какой процесс использует данный файл?

[root]# /usr/sbin/lsof /etc/passwd

Источник

Оцените статью
Adblock
detector