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

发布于 2024-12-10 13:07:24 字数 500 浏览 0 评论 0原文

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

谢谢!

I'm trying to output a system netstat -an -p TCP $interval > $log for a sleep of $seconds, and then quit/kill the netstat command but am having trouble getting it to work correctly.

If I use start netstat..., my sleep and kill commands work, but it does not write to the log.

If I only use netstat..., then it writes to the logs, but will not move on to the sleep and kill commands.

Any ideas on how to solve this??

$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";

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小帐篷 2024-12-17 13:07:24

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


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

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

  • 使用 start 启动批处理文件

Why don't you use IPC::Run? It has a kill_kill() method that is portable across Unix and Win32 (the latter is important if you're running on Windows as your "start" seems to possibly indicate).


As far as your own approach, the start xxx redirect doesn't work, so the easiest fix is to:

  • Create a batch file to run netstat and redirect to a file

  • Launch the batch file with start

假情假意假温柔 2024-12-17 13:07:24

你的麻烦是 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,所以您必须自己使该部分工作...)

Your trouble is that system() runs its command and waits for it to return, so you never get as far as calling sleep(). You need to run netstat from another process, or in the background. You can use fork() to acheive this, by spawning another process from your main process, and having that run 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";

(I don't have pskill, so you'll have to make that part work by yourself...)

深海夜未眠 2024-12-17 13:07:24

Forks::Super 使此类任务变得简单为你。

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

Forks::Super makes this kind of task easy for you.

use Forks::Super;
fork { cmd => $netstat_cmd, timeout => $seconds };
wait;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文