我正在尝试输出一个系统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";
谢谢!
答案 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;