如何执行外部Windows命令并立即返回Perl?

时间:2010-10-13 21:22:27

标签: windows perl

我尝试过使用带fork()的system(),尝试过exec(),但仍然没有得到我需要的东西。

我想写一个Perl脚本,它可以连续5次执行不同的Perl脚本(发送不同的参数值),但让它同时运行。我意识到我可以将我的脚本变成.pm文件并引用它,但我更喜欢保持子脚本独立于父级...

  • system()有效,但执行 连续命令(有道理) 每个文件)
  • exec()不起作用 - 它只执行 第一种方法(理所当然 DOC)
  • 我给子perl添加了一个fork() 脚本然后尝试使用system()
  • 这也不起作用。
  • backtick命令'文件说 与system()...
  • 的作用相同

Perl(我使用WindowsXP)执行进程是不是一种简单的方法,而不关心返回值或antyhing并继续进入父脚本的下一行?

5 个答案:

答案 0 :(得分:12)

你可以这样做(父亲中的fork,孩子中的exec):

for my $cmd qw(command1 command2 command3) {
       exec $cmd unless fork
}

exec $cmd unless fork的工作方式是fork将在父级中返回一个真值(进程ID)并在子级中返回false值,因此exec $cmd只会得到fork如果my @procs; for my $cmd qw(cmd1 cmd2 cmd3) { open my $handle, '-|', $cmd or die $!; push @procs, $handle; } 返回false(也就是孩子),则运行。

或者如果您希望在同时运行的过程中密切关注该过程:

@procs

然后,如果需要,您可以从Forks::Super的元素中读取。

或者看一下像{{1}}这样处理fork管理细节的许多cpan模块之一。

答案 1 :(得分:8)

在Windows上,您可以将超级机密1标志提供给系统IIRC。

system 1, @cmd;

快速谷歌搜索perlmonks上的这个问题给出:http://www.perlmonks.org/?node_id=639814

希望有所帮助。

答案 2 :(得分:3)

非常轻量级的方法。

视窗:

foreach my $cmd (@cmds)
{
    `start $cmd`;
}

Unix的:

foreach my $cmd (@cmds)
{
     `$cmd &`;
}

答案 3 :(得分:2)

你需要在父进程中分叉,然后执行新进程。它是这样的,假设A是原始脚本,B是你想做5次的那个:

                A1
fork in A1   -> A1 A2
exec B in A2 -> A1 B2
fork in A1   -> A1 A3 B2
exec B in A3 -> A1 B3 B2

答案 4 :(得分:2)

一个模块对这项工作来说太过分了。您希望fork创建一个新进程,然后exec在新进程中运行命令。要运行五个命令,您需要以下内容:

 for (my $i=0; $i<5; $i++) {
     if (fork() == 0) {
         exec($command[$i]);   # runs command, doesn't return
     }
 }