【问题标题】:Perl system(command) then kill commandPerl 系统(命令)然后杀死命令
【发布时间】:2011-10-19 00:42:32
【问题描述】:

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

谢谢!

【问题讨论】:

  • 如果我们能看到源代码,提出建议会更容易。此外,start 闻起来很像 Windows,这可能会影响答案。如果这是在 Windows 系统上,请将windows 添加到问题的标签中。谢谢!
  • 是的,这是针对 windows 的。稍后会添加代码,这种输入在移动设备上效果不佳。
  • 不要试图让你的源代码进入 cmets;它只是不能很好地工作。相反,请使用问题下方的edit 链接在此处添加源。谢谢!

标签: windows perl netstat


【解决方案1】:

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


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

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

  • 使用start启动批处理文件

【讨论】:

  • 我认为批处理文件选项是我的方案的修复。谢谢!
【解决方案2】:

你的问题是 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,所以你必须自己完成这部分工作......)

【讨论】:

  • 我认为这不适用于 Windows,这是我主要使用它的目的。谢谢!
  • 我在 Windows 上编写并测试了它。 fork() 曾经是个问题,但现在不是那么多了。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2013-06-25
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多