Solaris の truss は、FD が停止しているが機能していないことを示しています。

Solaris の truss は、FD が停止しているが機能していないことを示しています。

混乱しています。 DBAの1人が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は表示されません。トラス出力で見られるように開かれませんが、このトレース中に2回読み書き、閉じ、その後も引き続き使用されます。ネットワークトレースを実行するために何を言っているのか知りたいです...

以前に同様の動作を見たことがあり、説明に役立つ人はいますか?もちろん、会社の「故障していない場合は直さないでください」というポリシーもここで機能する可能性があります。

どんな情報でも大変感謝いたします。

答え1

プロセスはfdを使用するために開く必要はありません。

親プロセスが子プロセスが開かれたファイル記述子を継承できるようにする場合に機能します。

注:私は開いているファイル記述子のリストを信頼してtruss確認します。/proc/<pid>/fd/

答え2

Healyのコメントは、現在起こっている状況について正確です。しかし、私はそれについて少し拡張します。

ファイル記述子は zsched から継承されます。 while trueループ内で "date;pfiles"を実行すると、ファイル記述子が表示されますが、trussは同時に同じプロセスを追跡できません。ただし、エラーが発生したときにどのクライアントが接続されていたかが表示されます。

ローカルゾーン内のネットワークアダプタでリッスンできません。グローバルゾーンに移動すると、そのネットワークアダプタの特定のポートに移動するトラフィックを聞くことができました。これにより、Wiresharkを使用して問題を追跡して識別できます。

関連情報