我怎样才能反复调用另一个脚本?

时间:2009-06-10 18:05:04

标签: perl exec

我正在尝试编写一个调用另一个脚本的Perl脚本,该脚本读取整个目录。 我没有得到任何错误,但我也没有得到预期的结果。我屏幕上没有任何内容。

我不需要在屏幕上输出任何内容。我在exec()语句中调用的脚本应该将每个图像文件读入DIR目录,并创建一个文件,用于存储从该图像中提取的一些数据。 然后,exec()语句中的脚本应该循环,直到读入目录中的所有图像。

#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use CGI qw/:standard/; 
use CGI::Carp 'fatalsToBrowser';

my $dir = '/FilesToRead/';

my $fichier;
my $ligne;
my $mimetype;
my @listeFichiers;

my $cgi = CGI -> new();

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

while (my $ouvRep = readdir(DIR))
{
    foreach $fichier (@listeFichiers)
    {
        exec "v-file ./param.par ./Picture/$fichier -PM_overflow 3000000" or die "Script perl ne s'est pas execute";
    }
}   
closedir DIR;

6 个答案:

答案 0 :(得分:8)

exec取代当前正在运行的进程。参见

perldoc -f exec

你应该看看

perldoc -f system

答案 1 :(得分:4)

当您使用exec时,使用您调用的脚本替换现有的perl进程。请改用system

使用exec,程序在exec'脚本结束时结束。使用system,原始perl脚本会在system'脚本结束后继续。

请查看this question了解更多详情。

答案 2 :(得分:4)

您的代码有两个问题。首先,您使用readdir()时存在逻辑问题。第一次使用grep()时,它会读取整个目录并丢弃grep()不匹配的任何内容。在while条件下没有其他内容可读,因此它在没有单次迭代的情况下退出循环。

第二个问题是您使用exec()。正如man page所说

  

“exec”函数执行系统命令,如果你想让它返回,则永远不会返回 - 使用system“而不是”exec“。

foreach循环的第一次迭代用exec'd命令替换当前进程。只有v-file生成它才能获得输出。

我认为你的意思是在这里使用system()

答案 3 :(得分:2)

您写道:

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

while (my $ouvRep = readdir(DIR))

填充@listeFichiers后,readdir(DIR)将根据标量或列表上下文回复undef()。所以,你的while循环将循环零次。

无论如何,你在循环中需要什么?您已经拥有所需的文件列表。 如果您确定需要它,那么closediropendir之前

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
closedir DIR;

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
while (my $ouvRep = readdir(DIR))

或者您可以在第二个while循环之前调用rewinddir

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

rewinddir (DIR);

while (my $ouvRep = readdir(DIR))

答案 4 :(得分:1)

第一次执行exec调用时,您的进程将被替换。永远不会达到循环的第二次(和后续)迭代。

如果你使用系统(或者你想要输出的反引号)而不是exec,它应该做你想要的。你已经给出的具体答案是什么,你不满意吗?

答案 5 :(得分:1)

我想我会用fork做这个,也许用Parallel::ForkManager。对于每个项目,您分叉一个处理它的进程。您可以同时处理多件事。您无需等待system()完成。如果你只是试图从CGI脚本中触发它(而不是看到结果等),你甚至可能想要调度程序部分的守护程序,以便它自行处理以处理所有内容,并且CGI进程可以在没有它的情况下完成。 / p>

您也可以查看IPC::System::Simple以便轻松进行流程沟通。