Могу ли я найти список прослушиваемых портов процессом, упорядоченным по времени открытия?
Я знаю, что могу увидеть список открытых портов, используя 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
Команда часто, пока розетки открыты.