在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
本身不会返回,但两封电子邮件几乎同时发送。
答案 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以来,它没有必要