[LON-CAPA-cvs] cvs: loncom /interface printout.pl
foxr
lon-capa-cvs-allow@mail.lon-capa.org
Mon, 28 Jan 2008 11:24:49 -0000
foxr Mon Jan 28 06:24:49 2008 EDT
Modified files:
/loncom/interface printout.pl
Log:
BZ5548 - Timeout latex jobs that don't make dvi file grow after 10 seconds.
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.128 loncom/interface/printout.pl:1.129
--- loncom/interface/printout.pl:1.128 Thu Oct 11 18:49:49 2007
+++ loncom/interface/printout.pl Mon Jan 28 06:24:48 2008
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
#
-# $Id: printout.pl,v 1.128 2007/10/11 22:49:49 albertel Exp $
+# $Id: printout.pl,v 1.129 2008/01/28 11:24:48 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -379,14 +379,14 @@
my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/;
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement now LaTeXing file",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file, 10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement First LaTeX of file for table of contents",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file, 10);
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement Second LaTeX of file for table of contents",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file,10);
} #to create table of contents
my $idxname=$name_file;
$idxname=~s/\.tex$/\.idx/;
@@ -396,7 +396,7 @@
\%prog_state,$idxname);
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement now LaTeXing file for index section",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file,10);
} #to create index
#Do we have a latex error in the log file?
my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
@@ -512,14 +512,14 @@
#
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement first latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement second latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement third latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
}
if ($tableofindex eq 'yes') {
my $idxname = $latex_file;
@@ -529,7 +529,7 @@
\%prog_state, $idxname);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement now Recreting index (latex)",
- \%prog_state, $dvi_file);
+ \%prog_state, $dvi_file,10);
}
&busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
@@ -685,14 +685,14 @@
&repaginate($new_name_file, $latex_file, $numberofcolumns);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement first latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement second latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement third latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
}
if ($tableofindex eq 'yes') {
my $idxname = $latex_file;
@@ -702,7 +702,7 @@
\%prog_state, $idxname);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement now Recreting index (latex)",
- \%prog_state, $dvi_file);
+ \%prog_state, $dvi_file,10);
}
&busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips to repaginate",
@@ -794,9 +794,17 @@
sub REAPER {
$done=1;
}
-
+#
+# Execute a command updating the status window as the command's
+# output file builds up (at intervals of a second).
+#
+# If the timeout argument defined, then if that many seconds
+# elapses without an increase in the size of the output file,
+# the command will be killed (this deals with the case when
+# latex crawls into an infinite loop).
+#
sub busy_wait_command {
- my ($command,$message,$progress_win,$output_file)=@_;
+ my ($command,$message,$progress_win,$output_file, $timeout)=@_;
$SIG{CHLD} = \&REAPER;
$done=0;
@@ -804,12 +812,23 @@
if ($advanced_role) {
&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
}
+ my $last_size = 0;
+ my $unchanged_time = 0;
while(!$done) {
sleep 1;
my $extra_msg;
if ($output_file) {
my $size=(stat($output_file))[7];
$extra_msg=", $size bytes generated";
+ if ($size == $last_size) {
+ $unchanged_time++;
+ if ($timeout && ($unchanged_time > $timeout)) {
+ kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log.
+ }
+ } else {
+ $last_size = $size;
+ $unchanged_time = 0;
+ }
}
if ($advanced_role) {
&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,