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

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

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

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

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

PS: я не хочу идти по пути проверки журналов, потому что некоторые из этих портов открываются внешними банками, инициация которых находится вне нашего контроля.

2 ответа

Решение

Эта информация (обычно) не записывается. Для файла не существует "времени создания", 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() будет (обычно) блокировать, показывая только метку времени, когда она была вызвана, а не когда она завершена. -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 Команда часто, пока розетки открыты.

Другие вопросы по тегам