зеркало из
https://github.com/iharh/notes.git
synced 2025-10-30 13:16:07 +02:00
85 строки
6.0 KiB
Plaintext
85 строки
6.0 KiB
Plaintext
2021
|
||
https://www.tecmint.com/10-lsof-command-examples-in-linux/
|
||
https://bookflow.ru/10-primerov-komand-lsof-v-linux/
|
||
|
||
*************************************************************************************************
|
||
Утилиту lsof в дистрибутивах Linux чаще всего используют для просмотра открытых файлов. Я и сам так делаю, и много материалов на эту тему видел. Да и название у неё говорящее. Оно как раз образовано от фразы list open files.
|
||
Тем не менее, её можно использовать не только для этого.
|
||
|
||
▪️ Но сначала про основную функциональность. Лично я чаще всего запускаю lsof для просмотра открытых файлов, которые удалили, но забыли закрыть файловый дескриптор. Например, наживую удалили лог nginx или docker и не перезапустили сервис. В итоге файла нет, а место он занимает. Такие файлы будет видно вот так:
|
||
# lsof | grep '(deleted)'
|
||
или так:
|
||
# lsof +L1
|
||
|
||
▪️ Смотрим кем и что конкретно открыто из файлов в указанной директории:
|
||
# lsof +D /var/log
|
||
|
||
▪️ Смотрим открытые файлы конкретного пользователя:
|
||
# lsof -u user
|
||
Часто бывает нужно быстро узнать, сколько файлов у него открыто, чтобы понять, если с ним проблема или нет:
|
||
# lsof -u user | wc -l
|
||
А теперь то же самое, только наоборот исключим открытые файлы пользователя:
|
||
# lsof -u^user | wc -l
|
||
Рассмотрим ситуацию, когда под пользователем плодятся процессы, которые открывают кучу файлов и нам всё это надо быстро прибить. Добавляем ключ -t к lsof, который позволяет выводить только PID процессов. И отправляем вывод в kill:
|
||
# kill -9 `lsof -t -u user`
|
||
|
||
▪️ Файлы, открытые конкретным процессом, для которого указан его PID. Очень востребованная функциональность.
|
||
# lsof -p 94169
|
||
|
||
▪️ А теперь немного того, что от lsof не ожидаешь. Список TCP соединений, причём очень наглядный и удобный для восприятия.
|
||
# lsof -ni
|
||
|
||
▪️ Смотрим подробную информацию о том, кто открыл 80-й порт:
|
||
# lsof -ni TCP:80
|
||
|
||
▪️ Список TCP соединений к конкретному IP адресу:
|
||
# lsof -ni TCP@172.29.139.228
|
||
|
||
▪️ Список TCP соединений конкретного пользователя:
|
||
# lsof -ai -u nginx
|
||
|
||
▪️ Помимо TCP, можно и UDP соединения смотреть:
|
||
# lsof -iUDP
|
||
|
||
Публикацию имеет смысл сохранить в закладки.
|
||
|
||
***************************************************************************************************************************************************************************
|
||
|
||
Как быстро прибить приложение, которое слушает определённый порт?
|
||
|
||
Вариантов решения этой задачи может быть много. Первое, что приходит в голову - посмотреть список открытых портов в ss, узнать pid процесса и завершить его:
|
||
|
||
# ss -tulnp | grep 8080
|
||
tcp LISTEN 0 5 0.0.0.0:8080 0.0.0.0:* users:(("python3",pid=5152,fd=3))
|
||
# kill 5152
|
||
|
||
Но быстрее и проще воспользоваться lsof:
|
||
|
||
# lsof -i:8080
|
||
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
|
||
python3 5156 root 3u IPv4 41738 0t0 TCP *:http-alt (LISTEN)
|
||
# kill 5152
|
||
|
||
Или вообще в одно действие:
|
||
|
||
# lsof -i:8080 -t | xargs kill
|
||
|
||
Lsof могучая утилита. Я как-то особо не пользовался ей, кроме как для файлов, пока не подготовил заметку год назад с примерами использования (https://t.me/srv_admin/2856). С тех порт и для сетевых соединений стал активно применять. Особенно вот в таком виде:
|
||
|
||
# lsof -i
|
||
# lsof -i TCP:25
|
||
# lsof -i TCP@1.2.3.4
|
||
|
||
Возвращаюсь к открытым портам. Есть утилита killport (https://github.com/jkfran/killport), которая делает то же самое, что я делал выше, только в одну команду:
|
||
|
||
# killport 8080
|
||
|
||
В стандартных репах её нет, придётся качать бинарник из репозитория. Если для Linux это не сильно надо, так как там много инструментов для подобных действий, что я продемонстрировал выше, то для Windows это будет более актуально. Killport есть и под винду (❗️) Использовать можно примерно так:
|
||
|
||
> killport 445 --dry-run
|
||
Would kill process 'System' listening on port 445
|
||
|
||
То есть сначала смотрим, что будет прибито, а потом только делаем.
|
||
|
||
Такая штука обычно нужна для каких-то костылей и велосипедов, когда что-то зависает, не перезапускается, а надо освободить порт, чтобы запустить новый экземпляр.
|