2

我正在尝试输出一个系统netstat -an -p TCP $interval > $log睡眠 $seconds,然后退出/终止 netstat 命令,但无法使其正常工作。

如果我使用start netstat...,我的 sleep 和 kill 命令可以工作,但它不会写入日志。

如果我只使用netstat...,那么它会写入日志,但不会继续执行 sleep 和 kill 命令。

关于如何解决这个问题的任何想法?

$netstat_cmd = "netstat -an -p TCP $interval >$netstatlog;
$stop_netstat_cmd = "c:\utilities\pskill NETSTAT.exe";
system($netstat_cmd);
sleep $seconds;
system "$stop_netstat_cmd";

谢谢!

4

3 回答 3

2

你为什么不使用IPC::Run?它有一种kill_kill()可跨 Unix 和 Win32 移植的方法(如果您在 Windows 上运行,后者很重要,因为您的“开始”似乎可能表明)。


就您自己的方法而言,start xxx重定向不起作用,因此最简单的解决方法是:

  • 创建批处理文件以运行 netstat 并重定向到文件

  • 启动批处理文件start

于 2011-10-19T01:22:38.597 回答
0

你的问题是 system() 运行它的命令并等待它返回,所以你永远不会调用 sleep()。您需要从另一个进程或在后台运行 netstat。您可以使用 fork() 来实现这一点,方法是从您的主进程中生成另一个进程,并让该进程运行 netstat:

my $interval = 5;
my $netstatlog = "foo.tmp";
my $seconds = 10;

my $netstat_cmd = "netstat -an -p TCP $interval >$netstatlog";
my $stop_netstat_cmd = "pskill NETSTAT.exe";

if (my $pid = fork()) { # make new process
    print "launched netstat $pid\n";
}
else { # this is the "new" process
    system($netstat_cmd);
    exit();
}

sleep $seconds;

system "$stop_netstat_cmd";

(我没有pskill,所以你必须自己完成那部分......)

于 2011-10-19T02:11:33.417 回答
0

Forks::Super使您轻松完成此类任务。

use Forks::Super;
fork { cmd => $netstat_cmd, timeout => $seconds };
wait;
于 2011-10-19T02:39:45.713 回答