我可以在打开时查看正在进行的进程正在监听的端口列表吗?

我知道我可以使用lsof命令查看打开的端口列表。

我正在尝试通过听取时间戳来查看结果。

该进程打开多个(〜6)端口,我怀疑该端口上的初始化/绑定的顺序是一个错误的原因。 从技术上讲,应该可以通过查看在linux系统上创build的fd文件的创build时间戳来find绑定的相对时间戳。

我的查询是:有一个命令(netstat或lsof)已经这样做?

PS:我不想通过审查日志的路线,因为有些港口是由外部jar子打开的,而这些外部jar子是我们无法控制的。

这些信息不是(通常)logging的。 文件没有可用的“创build时间” , ctime用于文件inode /元数据更改时间。 所以,事实上,一般来说你不能可靠地确定相对或绝对时间。

在我testing过的任何Linux系统上(2.6.x和3.x),相关的/proc条目在你窥视它们之前不会被实例化,所有的时间戳都被设置为当前查询目录的时间(即,这些被创build按需显示当前状态,每当任何文件句柄改变时,内核不会不必要地更新这些)。 不要忘记,这些都是符号链接 ,时间戳与目标无关,而且这些套接字不会“活在”文件系统中。

 $ 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 

并在几秒钟后在另一个terminal:

 $ 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的使用,这可能是最简单的方式(虽然有一点性能开销)来观察相关networking操作的顺序。 您可能不需要或不想使用-f但它会遵循所有派生(子)进程,可能会混乱输出(如果是,则每个输出行都带有PID前缀)。

下一个最简单的方法可能是使用auditd / auditctl和规则(仔细过滤!)来logging操作,但是这也会对性能产生影响(如果您还没有运行auditdstrace只会影响受监视的进程) 。

当你有对等体连接时,你可以使用netstat来查看连接的详细信息( -p选项可能是有用的,因为它会显示进程),或者使用lsof – 虽然都不会显示连接时间戳。 要使用strace来logging这些连接,请将trace=添加到trace=选项中的syscalls列表中,并为每个系统调用添加-T选项: accept()将(通常)阻止,只显示调用的时间戳,而不是它完成了。 这将允许你计算完成时间。

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的输出组合,以知道哪个端口号对应于哪个文件描述符。

更新:发现返回的时间戳不是创build文件描述符的确切时间,而是创build文件描述符之后目录的前ls的时间。 所以要用上面的方法得到正确的时间,你需要在套接字被打开的时候经常运行ls命令。