Perl系统(命令)然后kill命令

时间:2011-10-19 00:42:33

标签: windows perl netstat

我正在尝试输出一个系统netstat -an -p TCP $interval > $log进行$秒的睡眠,然后退出/终止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";

谢谢!

3 个答案:

答案 0 :(得分:2)

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


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

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

  • 使用start

  • 启动批处理文件

答案 1 :(得分: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,所以你必须自己完成那部分工作......)

答案 2 :(得分:0)

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

use Forks::Super;
fork { cmd => $netstat_cmd, timeout => $seconds };
wait;