【问题标题】:killing tcpdump without corrupting the capture在不破坏捕获的情况下杀死 tcpdump
【发布时间】:2013-07-26 22:28:33
【问题描述】:

我正在尝试从 perl 脚本中使用 tcpdump 进行捕获。这个想法是捕获 10000 个数据包或 10 秒,以先到者为准。我有适用于 10000 个数据包的代码,但如果我向 tcpdump 发送 SIGINTSIGTERM 以取消它,输出似乎已损坏,导致脚本的其余部分出现问题(它处理tcpdump)。

相关perl代码:

    defined(my $pid = fork()) or die "Cannot fork: $!";
    if($pid){
        #parent
        my ($kid,$wait_time) = (0,0);
        do{
            sleep 1;
            $wait_time++;
            $kid = waitpid(-1, WNOHANG);
        }until ($kid > 0 || $wait_time > $MAX_TIME_SEC);

        #kill the child
        if ($kid <= 0){
            kill('SIGTERM',$pid);
        } 
    }else{
        #child runs tcpdump to get raw data and write it to a temporary file
        exec('tcpdump','-ieth1','-s0','-c'.$MAX_PACKETS,'-w'.$dmp_name);
    }

接下来发生的事情是该 tcpdump 生成的转储文件被输入到tshark 中,这会产生此错误:

tshark:“TheDumpFileFromAbove”似乎在中间被剪短了 一个数据包。

根据我在 tcpdump 手册页中看到的内容,发送 SIGTERMSIGINT 应该可以正常工作(我都尝试过):

如果使用 -c 标志运行,它将捕获数据包,直到它 被 SIGINT 或 SIGTERM 信号或指定数量的 数据包已处理完毕。

【问题讨论】:

  • 如果 tcpdump 没有处理此问题的信号处理程序,我认为您无能为力。
  • 你就不能忽略来自 tshark 的错误吗?
  • @JimGarrison,由于该错误,tshark 无法处理文件
  • @Barmar - fwiw,tcpdump 声称确实如此......并且在某种程度上它必须是真的 - 如果你发送一个 SIGINT 你会得到统计输出,如果你发送 SIGKILL 你什么都得不到
  • 那么 tshark 会处理整个文件并因为这个错误退出而不输出任何东西?

标签: perl tcpdump


【解决方案1】:

好的,所以问题是竞争条件:

kill('SIGTERM',$pid);

这告诉 tcpdump 优雅地退出,它在其中所做的一件事就是写出有关捕获的统计信息(即有多少数据包)。我注意到,如果我在那次杀戮之后立即添加打印语句,有时它会出现在统计数据之前,有时会出现在统计数据之后。所以解决方案是等到 tcpdump 完成后再继续执行下一个处理 tcpdump 输出的命令:

waitpid($pid,0);
system('tshark -r dumpcapfile ...')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多