Solaris 上的 truss 显示 FD 已关闭但未打开

Solaris 上的 truss 显示 FD 已关闭但未打开

我很困惑。我们的一位 DBA 报告了 LDAP 连接错误的问题。我想我应该开始从桁架追踪它,看看它到底连接到了什么,但我所看到的对我来说毫无意义。

这是有关文件描述符 35 的 truss 输出的完整摘录:

# grep 35 /tmp/11834.2.truss | grep -v write.33  
/3:     read(35, " 0", 1)                               = 1  
/3:     read(35, "\f", 1)                               = 1  
/3:     read(35, "020101 `0702010304\080\0", 12)        = 12  
/9:     write(35, " 084\0\0\010020101 a84\0".., 22)     = 22  
/3:     read(35, " 0", 1)                               = 1  
/3:     read(35, "81", 1)                               = 1  
/3:     read(35, "9E", 1)                               = 1  
/3:     read(35, "020102 c819804 : c n = a".., 158)     = 158  
/9:     write(35, " 084\0\001 8020102 d84\0".., 340)    = 340  
/3:     read(35, " 0", 1)                               = 1  
/3:     read(35, "05", 1)                               = 1  
/3:     read(35, "020103 B\0", 5)                       = 5  
/3:     close(35)                                       = 0  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "\f", 1)                               = 1  
/6:     read(35, "020101 `0702010304\080\0", 12)        = 12  
/8:     write(35, " 084\0\0\010020101 a84\0".., 22)     = 22  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "81", 1)                               = 1  
/6:     read(35, "98", 1)                               = 1  
/6:     read(35, "020102 c819204 4 c n = M".., 152)     = 152  
/9:     write(35, " 084\0\001 @020102 d84\0".., 348)    = 348  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "05", 1)                               = 1  
/6:     read(35, "020103 B\0", 5)                       = 5  
/6:     close(35)                                       = 0  
/6:     read(35, 0x7FFFEFB4FFB4B, 1)                    Err#131 ECONNRESET  
/6:     close(35)                                       = 0  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "\f", 1)                               = 1  
/6:     read(35, "020101 `0702010304\080\0", 12)        = 12  
/8:     write(35, " 084\0\0\010020101 a84\0".., 22)     = 22  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "81", 1)                               = 1  
/6:     read(35, "A3", 1)                               = 1  
/6:     read(35, "020102 c819D04 ? c n = a".., 163)     = 163  
/8:     write(35, " 084\0\001 B020102 d84\0".., 350)    = 350  
/6:     read(35, " 0", 1)                               = 1  
/6:     read(35, "05", 1)                               = 1  
/6:     read(35, "020103 B\0", 5)                       = 5  
/6:     close(35)                                       = 0  

如果我在此期间在进程上运行 pfiles,则永远不会看到 FD35。从我在桁架输出中可以看出,它从未打开过,但在此跟踪期间它被读取、写入和关闭两次,并且之后继续使用。我想知道它正在与什么对话以便运行网络跟踪......

有没有人以前见过类似的行为并可以帮助解释它?必须承认,公司的“如果没有坏,就不要修补它”的政策可能会在这里发挥作用......

任何信息都非常感激。

答案1

进程不需要打开 fd 就可以使用它。

如果父进程让子进程继承打开的文件描述符,它就会起作用。

顺便说一句:我会信任truss并检查/proc/<pid>/fd/打开的文件描述符列表。

答案2

希利的评论对于正在发生的事情来说是准确的。不过我要稍微扩展一下。

文件描述符是从 zsched 继承的。在 while true 循环内运行“date; pfiles”显示文件描述符,尽管它不允许桁架同时跟踪同一进程。但是,它确实显示了错误发生时哪个客户端正在连接。

无法监听本地区域内的网络适配器。转到全局区域,我能够监听流向该网络适配器上特定端口的流量。这使我能够使用 Wireshark 追踪问题并识别问题。

相关内容