Назад | Перейти на главную страницу

Могу ли я найти список портов, прослушиваемых процессом, упорядоченный на момент открытия?

Я знаю, что могу увидеть список открытых портов, используя lsof команда.

Я пытаюсь просмотреть результаты, упорядоченные по метке времени прослушивания.

Процесс открывает несколько (~ 6) портов, и я подозреваю, что порядок инициализации / привязки на этом порту является причиной ошибки. Технически должна быть возможность найти относительную временную метку привязки, посмотрев на временную метку создания файла fd, созданного в системах Linux.

Мой вопрос: есть ли команда (netstat или lsof), которая это уже делает?

P.S: Я не хочу идти по маршруту изучения журналов, потому что некоторые из этих портов открываются внешними jar-файлами, инициализация которых находится вне нашего контроля.

Эта информация (обычно) не записывается. Там есть нет доступного "времени создания" для файла, ctime для времени изменения inode / метаданных файла. Таким образом, постфактум, как правило, вы не можете надежно определить относительное или абсолютное время.

В любой системе Linux (2.6.x и 3.x), которую я тестировал, соответствующие /proc записи не создаются до тех пор, пока вы не заглянете в них, все временные метки установлены на время первого запроса каталога (т.е. они создаются по требованию, чтобы показать текущее состояние, ядро ​​не обновляет их каждый раз, когда любой дескриптор файла изменения). Не забывай, это все символические ссылкис временными метками, независимыми от цели, и эти сокеты не «живут» в файловой системе.

$ strace -tt -f -e trace=bind,listen /usr/bin/nc -l -p 8080
13:23:23.693432 bind(3, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr(
                "0.0.0.0")},16) = 0
13:23:23.693542 listen(3, 1)            = 0

и через несколько секунд в другом терминале:

$ date;  ls -cl --full-time /proc/$(pgrep -f "^/usr/bin/nc -l -p 8080")/fd
Mon May 19 13:23:31 IST 2014
total 0
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 0 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 1 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 2 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 3 -> socket:[206347913]

Время всех символических ссылок устанавливается на 8 секунд позже, когда ls побежал.

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

Следующий простейший метод, вероятно, будет использовать auditd/auditctl с правилами (и тщательной фильтрацией!) для регистрации операций, это тоже влияет на производительность (в масштабе всей системы, если вы еще не запускаете auditd, strace повлияет только на отслеживаемые процессы).

Когда у вас есть одноранговые соединения, вы можете использовать netstat чтобы увидеть детали подключения ( -p вариант может быть полезен, поскольку он покажет процесс), или используйте lsof - хотя ни один из них не покажет отметки времени подключения. Для записи этих подключений с помощью strace, Добавить accept в список системных вызовов в trace= вариант и добавьте -T возможность установки времени для каждого системного вызова: accept() will (обычно) блокируется, показывая только метку времени, когда он был вызван, а не время его завершения. -T это позволит вам рассчитать время завершения.

Дополнительный выход для accept() выглядит как:

13:25:46.022244 accept(3, {sa_family=AF_INET, sin_port=htons(57534), sin_addr=inet_addr(
                "127.0.0.1")}, [16]) = 4 <3.167477>

показывая, что сокет был готов принимать соединения в 13:25:46 и получил первое соединение через 3,167 секунды.

Это похоже на большую часть трюка: ls --full-time /proc/$PID/fd

Вам нужно объединить этот вывод с выводом из lsof чтобы узнать, какой номер порта соответствует какому дескриптору файла.

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