Perl-скрипт: как понять, завершился ли процесс - PullRequest
0 голосов
/ 04 мая 2011

Это то, что я создал до сих пор относительно вашего совета:

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

1 голос
/ 04 мая 2011

Рэндал Шварц Наблюдение за длительными процессами через CGI может быть полезным здесь.

Что касается использования вашей собственной таблицы стилей, вы можете просто указать, что в разделе <head>...</head> вы излучаете.

0 голосов
/ 04 мая 2011

Когда ваш внешний процесс завершится, <$pipe> вернет undef и ваш цикл while

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

завершится (до этого времени <$pipe> будет блокироваться в ожидании доступности ввода). Следовательно, вы можете сказать, что работа завершена, когда цикл while завершен. Если вы можете, вы захотите настроить вашу внешнюю команду (/love/peace/harmony/./lovepeace.bash), чтобы она не буферизовала свои выходные данные.

0 голосов
/ 04 мая 2011

Возможно, имеет смысл реализовать это как ajax. Разрешить странице для полного рендеринга, а затем запрос Ajax, чтобы следить за прогрессом. Ваша страница может отображаться неправильно, если она не видна до тех пор, пока процесс не будет завершен.

РЕДАКТИРОВАТЬ: Извините, неполная мысль. Более тщательный подход к просмотру построчного вывода заключается в том, чтобы запустить этот сценарий как фоновый процесс, записывающий выходные данные в журнал, а затем заставить код сервера ajax (отдельный CGI) возвращать обработанные до сих пор строки и флаг если процесс завершился.

...