Perl脚本:如何实现进程已完成

时间:2011-05-04 13:57:20

标签: perl process cgi wait

这是我迄今为止建议的:

#!/usr/bin/perl -w
use strict; 
use CGI qw(:standard);

#some variables 
my $message = "please wait, loading data...\n";  

#First build the web page 
print header; 
print start_html('Hello World'); 
print "<H1>we need love, peace and harmony</H1>\n";
print "<p>$message</p>\n";

#Establish a pipeline between the bash and my script.
my $bash_command = '/love/peace/harmony/./lovepeace.bash'; 
open(my $pipe, '-|', $bash_command) or die $!;
while (my $line = <$pipe>){ 
# Do something with each line.
print "<p>$line</p>\n"; 
}  

#when is the job done...?
print end_html;

当我在浏览器中调用.pl脚本时,一切都很好:-)但是我仍然会想到一些问题:

当我打电话给这个网站时,它正忙于从管道中加载一些值。由于有大约10个值,它相当快(2-4秒)但是如果我有100+值,用户必须等待一段时间。由于我没有进度条,我应该向用户提供信息。

赞:“正在加载数据,请稍等......”

当工作完成后,此消息应说:“完成工作”或类似的事情。

•如何确定流程是否已完成?

•如果作业完成,我可以重新加载页面吗?

•是否有机会使用我自己的样式表来使用perl-CGI

此致

JJ

3 个答案:

答案 0 :(得分:1)

Randal Schwartz的Watching long processes through CGI在这里可能会有所帮助。

至于使用自己的样式表,您只需在<head>...</head>部分指定即可。

答案 1 :(得分:0)

将此实现为ajax可能更有意义。允许页面完全呈现,然后有一个ajax请求来观察进度。如果在完成该过程之前没有看到您的页面,则该页面可能无法正常显示。

编辑:抱歉,不完整的想法。查看逐行输出的更彻底的方法是将该脚本作为后台进程将输出写入日志,然后使用ajax服务器代码(单独的CGI)返回到目前为止处理的行和标志如果该过程已经退出。

答案 2 :(得分:0)

外部流程完成后,<$pipe>将返回undef和您的while循环

while (my $line = <$pipe>) { ... }

将结束(在此之前,<$pipe>将在等待输入可用时阻止)。因此,您可以在while循环完成后判断作业已完成。如果可以,您需要配置外部命令(/love/peace/harmony/./lovepeace.bash)以不缓冲其输出。