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