如何顺序启动许多程序而不被阻止?

时间:2013-05-02 03:23:11

标签: perl

在unix系统中

我有一个名为program_sets的目录,在program_sets中,有8个目录,每个目录中都有一个名为A.pl的程序

我想在同一时间启动并运行8个A.pl程序,但是当我启动第一个程序时,程序将被阻塞,直到第一个程序调用完成。我该如何解决这个问题?

这是我的代码

#!/usr/bin/perl

opendir(Programs,"./program_sets");
@Each_names = readdir(Programs);
shift(@Each_names);
shift(@Each_names);

for($i=0;$i<=$#Each_names;$i++)
{
    `perl ./program_sets/$Each_names[$i]/A.pl`;
}

感谢

3 个答案:

答案 0 :(得分:1)

使用&在后​​台运行它们,就像在shell中一样。

for($i=0;$i<=$#Each_names;$i++)
{
    system("perl ./program_sets/$Each_names[$i]/A.pl >/dev/null 2>&1 &");
}

此外,在将输出分配给变量时,应使用反引号。使用system()运行命令而不保存输出。

答案 1 :(得分:0)

在* NIX中,您可以添加“&amp;”到命令行在后台启动程序。

另一种选择是使用fork()http://perldoc.perl.org/functions/fork.html

答案 2 :(得分:0)

这里看起来还有一些其他问题。

#!/usr/bin/perl

# warnings, strict
use warnings;
use strict;

# lexically scoped $dh
#opendir(Programs,"./program_sets");
my $cur_dir = "./program_sets";
opendir(my $dh, $cur_dir);

# what exactly is being shifted off here? "." and ".."??
#@Each_names = readdir(Programs);
#shift(@Each_names);
#shift(@Each_names);

# I would replace these three lines with a grep and a meaningful name.
# -d: only directories. /^\./: Anything that begins with a "." 
# eg. hidden files, "." and ".."
my @dirs = grep{ -d && $_ !~ /^\./ } readdir $dh;
close $dh;

for my $dir ( @dirs ) {
    my $path = "$cur_dir/$dir";

    system("perl $path/A.pl >/dev/null 2>&1 &");
}