2

私はsubprocess.Popentcpdumpを実行するために使用しています。これにより、コードでパッケージ情報が適切に収集される可能性があります。
その後、を使用して別のスレッドでtcpdumpを強制終了し os.kill(pid, signal.SIGKILL)、相対パケットの統計情報を記録したいと思います。

一般に、bashでtcpdumpを実行するときに、統計情報を取得したいと思います。

  • キャプチャされたパケット
  • フィルタによって受信されたパケット
  • カーネルによってドロップされたパケット

私は次の形式でcmdを試しました:

proc=subprocess.Popen(shlex.split(tcpdump_cmd), 
                      stdouot=subprocess.PIPE, 
                      stderr=subprocess.PIPE)

proc.pidただし、 byを強制終了した後、統計を取得できませんでしたproc.stdout/stderr.readline()
私も使用しようとしました:

fcntl.fcntl(fd.fileno().fcntl.F_SETFL,
            (fcntl.fcntl(fd.fileno.F_GETFL) | os.O_NDELAY | os.O_NONBLOCK))

それらのどれも私が期待したように統計を出力することができません。また、試してみましshell=Trueたが、shell=false同じ結果になりました。

それを達成する方法はありますか?ありがとうございました!

PS tcpdumpに関連するトピックがいくつかあることがわかりましたが、残念ながら、私が知る限り、この問題で役立つトピックは見つかりませんでした。

4

1 に答える 1

2

どのようにプロセスを殺していますか?

これがUN*Xの場合、次のようになります。

  • SIGKILLで強制終了すると、tcpdumpがすぐに終了し、統計を出力する機会がなくなるため、読み取る統計がなくなります。
  • SIGTERMまたはSIGINTを使用して強制終了する場合は、キャッチしたシグナルを送信するため、終了する前に統計を出力します。

これがWindowsの場合(WinDumpを使用している場合)、統計を出力する機会を与えるWindowsを終了する方法がない可能性があります。

于 2013-02-17T19:20:32.350 に答える