Perl:“系统”何时实际返回?

时间:2012-09-03 10:38:32

标签: perl unix cgi

在CGI网页中,我有一个按钮,当按下提交表单时,会调用一个子程序:

sub run {
     &emailDebug("Started " .localtime);
    system("(/tools/script1.pl &) ; (/tools/script2.pl &)");
    &emailDebug("Ended " .localtime);
}

他们都是在11:08:05开始(因此是花哨的命令),我自己在脚本中加上时间戳并通过电子邮件发送给自己。

第二次完成11:08:22和第一次11:08:36,但上面发送的电子邮件将显示11:08:06。

最有趣的是,只要两个脚本中的较长时间运行,页面就会加载大约30秒。

我不介意页面加载,但我不明白为什么它的行为像这样。作为 页面正在加载,显然子程序run本身不会返回,但两封电子邮件几乎同时发送。

3 个答案:

答案 0 :(得分:6)

只要您调用的命令允许,

system就会返回。在这个特定的例子中,它应该立即返回,但这可能会因shell而异。为了更加确定,您可能会尝试将呼叫分成两部分:

system("/tools/script1.pl &");
system("/tools/script2.pl &");

此外,根据您的Web服务器配置,它可能会注意到仍然在分叉的子节点中打开STDOUT,它将等待所有它们在提供响应之前结束,即使您的主脚本已经结束。将生成的脚本STDOUT / ERR重定向到主脚本中的/ dev / null,close(STDOUT)close(STDERR),或参考您的web-server / framework文档,了解在完成输出后如何刷新响应。 / p>

答案 1 :(得分:2)

您正在执行脚本作为后台进程,因此系统立即返回。如果您想等待完成,请删除&并按顺序执行它们:

system("(/tools/script1.pl) ; (/tools/script2.pl)");

答案 2 :(得分:1)

上面的那些印刷语句是什么意思?您的代码没有显示print次来电

一旦两个子进程启动,您的run子例程就会返回。通过对system进行两次调用并删除命令行中的括号,可以使事情变得更清晰。由于尾随的&符号,系统的两次调用都会立即返回,让孩子独立运行

在调用run之后,其他一些东西必须延迟页面的返回,并且可能是以某种方式检测子进程的工作何时完成

顺便说一句,当你进行简单的调用时,你应该从不在子程序名上使用&符号。自从我们十八年前获得Perl 5以来,它没有必要

相关问题