- Sysadminium
- Bash cкрипт получения числа открытых файлов пользователя
- 10 примеров команд lsof в Linux
- 1. Список всех открытых файлов с помощью команды lsof
- 2. Список открытых файлов конкретного пользователя
- 3. Найти процессы, запущенные на определенном порту
- 4. Список только IPv4 и IPv6 открытых файлов
- 5. Список открытых файлов диапазона TCP-портов 1-1024
- 6. Исключение пользователя с помощью символа ‘^’
- 7. Узнайте, кто какие файлы смотрит и какие команды использует.
- 8. Список всех сетевых подключений
- 9. Поиск по PID
- 10. Убить все активности конкретного пользователя
Sysadminium
Bash cкрипт получения числа открытых файлов пользователя
Данный скрипт позволяет узнать сколько открытых файлов у определённого пользователя Linux. Это бывает необходимо для отладки службы, работающей под определённым пользователем.
В качестве параметра скрипту необходимо передать имя или uid пользователя.
Скрипт будем использовать следующими способами:
Вот сам скрипт (удобнее нажать кнопочку «extern«):
#!/bin/bash case "$1" in -h) echo -e "Скрипт покажет открытые файлы для выбранного пользователя. Опции: -h показать эту справку. Примеры выполнения: ./files2.sh ./files2.sh " ;; *) if [[ "$#" -eq 1 ]]; then id "$1" >/dev/null 2>&1 if [[ $? -ne 0 ]]; then echo 'Пользователь не найден!' exit 1 fi for pid in `ps -u "$1" -o pid,comm | grep -v PID | awk ''` do open_files=`ls -l /proc/$pid/fd | grep "anon_inode" | wc -l` echo "Открытых файлов для pid $pid: $open_files" done else echo -e "Забыли указать имя или id пользователя! Или ввели больше одного параметра. Для справки выполните $0 -h" fi ;; esac
Если скрипт получит параметр -h, то с помощью echo просто выведет справку.
Если скрипт получит всего один любой другой параметр, то он будет считаться именем пользователя. В этом случае, если такого пользователя в системе не будет, то скрипт скажет об этом.
Если скрипт получит не 1 а больше или меньше параметров, то эта ситуация также будет обработана.
Весь код по получению открытых файлов заключен в этих строчках:
for pid in `ps -u "$1" -o pid,comm | grep -v PID | awk ''` do open_files=`ls -l /proc/$pid/fd | grep "anon_inode" | wc -l` echo "Открытых файлов для pid $pid: $open_files" done
То есть мы пробегаемся по всем процессам данного пользователя, и для каждого процесса (pid) вычисляем количество открытых файлов. Подробнее о таких циклах я уже писал в статье «Обработка строк циклом «for line in comand»«
# ./files2.sh 1000 Открытых файлов для pid 600: 6 Открытых файлов для pid 618: 6 Открытых файлов для pid 878: 2274 Открытых файлов для pid 1112: 3
Если есть замечания по улучшению этого скрипта, пишите в комментариях!
Данный скрипт позволяет узнать сколько открытых файлов у определённого пользователя 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.
Примечание: Здесь невозможно привести примеры всех доступных опций, это руководство лишь показывает, как можно использовать команду lsof. Вы можете обратиться к странице справки команды lsof, чтобы узнать о ней больше.