Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl脚本:如何实现进程是否已完成_Perl_Process_Cgi_Wait - Fatal编程技术网

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

Perl脚本:如何实现进程是否已完成,perl,process,cgi,wait,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, pe

这是我迄今为止就您的建议所做的:

#!/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;
#/usr/bin/perl-w
严格使用;
使用CGI qw(:标准);
#一些变量
my$message=“请稍候,正在加载数据…\n”;
#首先构建网页
打印头;
打印start_html(“Hello World”);
打印“我们需要爱、和平与和谐\n”;
打印“$message

\n”; #在bash和我的脚本之间建立一个管道。 我的$bash_命令='/love/peace/harmony//lovepeace.bash'; 打开(我的$pipe、'-|'、$bash_命令)或死亡$!; 而(我的$line=){ #对每一行做点什么。 打印“$line

\n”; } #工作什么时候完成。。。? 打印结束html;
当我在浏览器中调用该.pl脚本时,一切都很好:-)但我仍在思考几个问题:

当我调用此网站时,它正忙于从管道加载一些值。由于大约有10个值,所以速度相当快(2-4秒),但如果我有100多个值,用户必须等待一段时间。因为我没有进度条,所以我应该向用户提供一个信息

例如:“正在加载数据,请稍候…”

当工作完成时,这个信息应该说:“工作完成”或类似的话

•我如何知道该流程是否已完成

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

•有没有可能在这个perl CGI中使用我自己的样式表

问候,

JJ

兰德尔·施瓦茨的建议可能会有所帮助


至于使用您自己的样式表,您只需在发出的
部分中指定它。

将其实现为ajax可能更有意义。允许页面完全呈现,然后发出ajax请求以查看进度。如果您的页面在流程完成后才看到,则可能无法很好地显示


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

当外部进程完成时,
将返回
unde
和while循环

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

请参阅:关闭任何管道文件句柄会导致父进程等待子进程完成,并以$为单位返回状态值?和${^CHILD\u ERROR\u NATIVE}。