3

在 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本身并没有返回,但两封电子邮件几乎同时发送。

4

3 回答 3

6

system只要您调用的命令允许它返回,它就会返回。在此特定示例中,它应该立即返回,但这可能会根据 shell 中断。为了更加确定,您可能会尝试将通话一分为二:

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

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

于 2012-09-03T11:20:47.873 回答
2

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

system("(/tools/script1.pl) ; (/tools/script2.pl)");
于 2012-09-03T10:52:32.890 回答
1

上面的打印语句是什么意思?您的代码显示没有print调用

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

在调用 to 之后必须有其他东西延迟页面的返回run,并且大概它以某种方式检测子进程的工作何时完成

顺便说一句,当您进行简单调用时,您不应该子例程名称上使用与号。自从 18 年前我们得到 Perl 5 以来,它就没有必要了

于 2012-09-03T11:39:38.170 回答