我尝试过使用带fork()的system(),尝试过exec(),但仍然没有得到我需要的东西。
我想写一个Perl脚本,它可以连续5次执行不同的Perl脚本(发送不同的参数值),但让它同时运行。我意识到我可以将我的脚本变成.pm文件并引用它,但我更喜欢保持子脚本独立于父级...
Perl(我使用WindowsXP)执行进程是不是一种简单的方法,而不关心返回值或antyhing并继续进入父脚本的下一行?
答案 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
}
}