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

Вики IT-KB

Как проверить все открытые файлы пользователем или процессом в Linux

В некоторых ситуациях на Linux могут возникать ошибки, связанные с превышением лимита использования файловых дескрипторов. Эти лимиты накладываются как самим ядром Linux, так и его программными модулями, например PAM.

Лимит ядра Linux

Узнать текущее значение максимального количества файловых дескрипторов, определяемое ядром Linux можно командой:

Этот лимит может быть изменён без перезагрузки системы (начинает действовать сразу и действует до перезагрузки):

# echo "1221724" > /proc/sys/fs/file-max

Чтобы требуемое значение использовалось постоянно, то есть действовало и после перезагрузки, его необходимо определить в конфиг.файле /etc/sysclt.conf :

Методика подсчёта открытых файлов

Для получения информации о количестве всех открытых файлов всеми процессами в Linux некоторые «знатоки» предлагают использовать команду типа

Однако такая команда показывает гораздо большее значение, чем всего открыто файлов в системе на данный момент на самом деле. Это связано с тем, что по несколько раз в подсчёт попадают одни и теже открытые файлы, используемые разными процессами.

Поэтому проще для получения общего числа открытых файлов использовать данные ядра Linux

# cat /proc/sys/fs/file-nr
5248 0 610862

Первое число — общее количество занятых/используемых на данный момент времени файловых дескрипторов.
Второе число — количество выделенных процессам, но не используемых в данный момент дескрипторов.
Третье число — максимальное количество открытых дескрипторов

Примеры получения данных

Получить список TOP-20 процессов с самым большим количеством открытых файловых дескрипторов:

# for x in `ps -eF| awk '< print $2 >'`; \ do echo `ls /proc/$x/fd 2> /dev/null | \ wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`; \ done | sort -n -r | head -n 20

Подсчитать количество открытых файлов в разрезе процессов (в первой колонке будет выведен PID процесса, во второй количество открытых файлов этим процессом):

# ps aux | sed 1d | awk \ '' | \ xargs -I <> bash -c <>

Посмотреть открытые файловые дескрипторы во всех процессах для отдельно взятого пользователя, например «apache»

Подсчитать количество открытых файлов в каждом процессе для отдельно взятого пользователя:

# lsof -u apache | awk '' | sort | uniq -c | sort -n

Тоже самое, только в реальном режиме времени:

# watch 'lsof -u vdsm | awk '\'''\'' | sort | uniq -c | sort -n'

Посмотреть открыте файловые дескриптры для отдельно взятого процесса (по PID процесса):

Читайте также:  Виртуализация linux на vmware

Подсчитать количество файловых дескриптров для отдельно взятого процесса:

Дополнительные источники информации:

Проверено на следующих конфигурациях:

Автор первичной редакции:
Алексей Максимов
Время публикации: 09.06.2018 11:18

Обсуждение

unix-linux/linux-cli-tools/how-to-check-all-open-files-by-process-or-user-in-linux.txt · Последнее изменение: 09.06.2018 12:49 — Алексей Максимов

Источник

10 примеров команд lsof в Linux

10 примеров команд lsof в Linux

Мы продолжаем цикл статей о командах Linux, и в этой статье мы рассмотрим команду lsof с практическими примерами. lsof означает «LiSt Open Files«, используется для того, что бы понять, какие файлы открыты каким процессом. Как мы все знаем, Linux/Unix рассматривает все как файлы (каналы, сокеты, каталоги, устройства и т.д). Одной из причин использования команды lsof является ситуация, когда диск не может быть размонтирован, так как он говорит, что файлы используются. С помощью этой команды мы можем легко определить используемые файлы.

1. Список всех открытых файлов с помощью команды lsof

В приведенном ниже примере показан длинный список открытых файлов, которые отображают такие столбцы, как Command, PID, USER, FD, TYPE и т.д.

# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root 0u CHR 1,3 0t0 3764 /dev/null init 1 root 1u CHR 1,3 0t0 3764 /dev/null init 1 root 2u CHR 1,3 0t0 3764 /dev/null init 1 root 3r FIFO 0,8 0t0 8449 pipe init 1 root 4w FIFO 0,8 0t0 8449 pipe init 1 root 5r DIR 0,10 0 1 inotify init 1 root 6r DIR 0,10 0 1 inotify init 1 root 7u unix 0xc1513880 0t0 8450 socket

Разделы и их значения не требуют пояснений. Однако мы рассмотрим столбцы FD и TYPE более подробно.

FD – обозначает дескриптор файла и может иметь такие значения, как:

  • cwd – текущий рабочий каталог
  • rtd – корневой каталог
  • txt – текст программы (код и данные)
  • mem – файл памяти

Также в столбце FD номера, например 1u — это фактический дескриптор файла, за которым следуют u,r,w как режим доступа:

TYPE — файлов и их идентификация.

2. Список открытых файлов конкретного пользователя

Следующая команда выведет список всех открытых файлов пользователя tecmint.

# lsof -u tecmint COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1838 tecmint cwd DIR 253,0 4096 2 / sshd 1838 tecmint rtd DIR 253,0 4096 2 / sshd 1838 tecmint txt REG 253,0 532336 188129 /usr/sbin/sshd sshd 1838 tecmint mem REG 253,0 19784 190237 /lib/libdl-2.12.so sshd 1838 tecmint mem REG 253,0 122436 190247 /lib/libselinux.so.1 sshd 1838 tecmint mem REG 253,0 255968 190256 /lib/libgssapi_krb5.so.2.2 sshd 1838 tecmint mem REG 253,0 874580 190255 /lib/libkrb5.so.3.3

3. Найти процессы, запущенные на определенном порту

Чтобы узнать все запущенные процессы на определенном порту, просто используйте следующую команду с опцией -i. В приведенном ниже примере будут перечислены все запущенные процессы на 22 порту.

# lsof -i TCP:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)

4. Список только IPv4 и IPv6 открытых файлов

В приведенном ниже примере показаны только IPv4 и IPv6 сетевые файлы.

# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 # lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)

5. Список открытых файлов диапазона TCP-портов 1-1024

Список всех запущенных процессов открытых файлов TCP в диапазоне 1-1024.

# lsof -i TCP:1-1024 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1838 tecmint 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)

6. Исключение пользователя с помощью символа ‘^’

Здесь мы исключили пользователя root. Вы можете исключить любого пользователя, используя команду ‘^‘ как показано выше.

# lsof -i -u^root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146 rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)

7. Узнайте, кто какие файлы смотрит и какие команды использует.

В примере ниже показано, что пользователь tecmint использует команду ping и каталог /etc.

# lsof -i -u tecmint COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1839 tecmint cwd DIR 253,0 12288 15 /etc ping 2525 tecmint cwd DIR 253,0 12288 15 /etc

8. Список всех сетевых подключений

Следующая команда с опцией ‘-i‘ показывает список всех сетевых соединений ‘LISTENING & ESTABLISHED’.

# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN) clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT) chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED) chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)

9. Поиск по PID

В приведенном ниже примере показан только PID is 1 [One].

# lsof -p 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so

10. Убить все активности конкретного пользователя

Иногда вам может потребоваться убить все процессы определенного пользователя. Приведенная ниже команда убьет все процессы пользователя tecmint.

Читайте также:  Oracle linux добавить репозиторий

Примечание: Здесь невозможно привести примеры всех доступных опций, это руководство лишь показывает, как можно использовать команду lsof. Вы можете обратиться к странице справки команды lsof, чтобы узнать о ней больше.

Источник

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