Solaris의 truss는 FD가 작동 중지되었지만 작동되지 않았음을 보여줍니다.

Solaris의 truss는 FD가 작동 중지되었지만 작동되지 않았음을 보여줍니다.

혼란스러워요. DBA 중 한 명이 LDAP 연결 오류 문제를 보고했습니다. 나는 그것이 정확히 무엇과 연결되어 있는지 알아보기 위해 트러스에서 그것을 추적하기 시작할 것이라고 생각했지만, 내가 본 것은 나에게 이해가 되지 않았습니다.

다음은 파일 설명자 35에 대한 트러스 출력의 전체 발췌입니다.

# 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

Healy의 의견은 현재 일어나고 있는 상황에 대한 정확합니다. 그러나 나는 그것에 대해 조금 확장할 것입니다.

파일 설명자는 zsched에서 상속됩니다. while true 루프 내에서 "date;pfiles"를 실행하면 파일 설명자가 표시되지만 truss는 동시에 동일한 프로세스를 추적할 수 없습니다. 그러나 오류가 발생했을 때 어떤 클라이언트가 연결되어 있었는지 표시됩니다.

로컬 영역 내의 네트워크 어댑터에서 수신 대기할 수 없습니다. 전역 영역으로 이동하면 해당 네트워크 어댑터의 특정 포트로 이동하는 트래픽을 들을 수 있었습니다. 이를 통해 Wireshark를 사용하여 문제를 추적하고 식별할 수 있었습니다.

관련 정보