Perl:"系统"何时实际返回?

Rec*_*cct 3 unix perl cgi

在CGI网页中,我有一个按钮,当按下提交表单和子程序时,它具有:

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

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

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

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

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

Ole*_*kov 6

system只要您调用的命令允许它返回.在这个特定的例子中,它应该立即返回,但这可能会因shell而异.为了更加确定,您可能会尝试将呼叫分成两部分:

system("/tools/script1.pl &");
system("/tools/script2.pl &");
Run Code Online (Sandbox Code Playgroud)

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