2011-05-04 41 views
0

這是我到目前爲止創建關於您的諮詢:Perl腳本:如何實現某個進程已完成

#!/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; 

當我打電話,在我的瀏覽器腳本特等,一切工作不錯:-)但有幾個問題仍在我的腦海裏:

當我打電話給這個網站時,它正忙於從管道中加載一些值。由於有大約10個值其相當快(2-4秒),但如果我將有超過100個值,用戶必須等待一段時間。由於我無法擁有進度條,因此我應該向用戶提供信息。

一樣:「正在加載數據,請稍候......」

當任務完成,此消息應該說:「作業已完成」或類似的東西。

•如何瞭解流程是否已完成?

•如果作業完成,我可以重新加載頁面嗎?

•有沒有用我自己的樣式表wihtin這與Perl CGI

問候,

JJ

+0

請參閱[documentation](http://perldoc.perl.org/functions/open.html):關閉任何管道文件句柄會導致父進程等待子進程完成,並返回狀態值$?和$ {^ CHILD_ERROR_NATIVE}。 – ceving 2011-05-04 14:07:35

回答

1

蘭德爾·施瓦茨的Watching long processes through CGI可能會有所幫助這裏的任何機會。

至於使用你自己的樣式表,你可以在你發出的<head>...</head>部分指定。

0

將它作爲ajax實現可能更有意義。允許頁面完整渲染,然後發出ajax請求來觀察進度。如果在處理完成前沒有看到該頁面,則可能無法很好地顯示頁面。編輯:對不起,思想不完整。查看逐行輸出的更徹底的方法是將腳本作爲後臺進程啓動,將輸出寫入日誌,然後讓ajax服務器代碼(單獨的CGI)返回到目前爲止處理過的行以及一個標誌如果該過程已經退出。

0

當你的外部進程完成後,<$pipe>將返回undef和while循環

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

將結束(在此之前,<$pipe>將在等待輸入可用塊)。因此,當while循環完成時,您可以知道該作業已完成。如果可以的話,你會想要配置你的外部命令(/love/peace/harmony/./lovepeace.bash)不緩衝它的輸出。

相關問題