From a33d33d4cfc6327fd60311a6a3931e481d50221f Mon Sep 17 00:00:00 2001 From: David Cook Date: Thu, 29 Oct 2020 04:24:31 +0000 Subject: [PATCH] Bug 26854: Close STDERR when forking stage-marc-import.pl We need to close STDERR when forking stage-marc-import.pl, or else the CGI session with Apache httpd does not properly finish. This leads to unexpected behaviour across different httpd versions, operating systems, etc. This patch closes the STDERR file handle when forking a child process to do MARC imports, and it re-opens STDERR to a log file in the logdir directory to catch any import errors. Test plan: 1. Apply the patch 2. Go to http://localhost:8081/cgi-bin/koha/tools/stage-marc-import.pl 3. Upload a MARC file with a large number of records (e.g. 30,000 records) 4. Open F12 dev tools 5. Click on "Network" tab 6. Clear all existing network logs 7. Click "Stage for import" 8. After ~30 seconds, the request to stage-marc-import.pl should return a 200 code 9. Immediately, calls to background-job-progress.pl should start, and the "Job progress" bar should update at a maximum rate of every .5 seconds (or more realistically 1-2 seconds) Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Jonathan Druart (cherry picked from commit f3cacc62cda58798e8f2de6cfdd636772d2158f0) Signed-off-by: Andrew Fuerste-Henry (cherry picked from commit e5a3989e63e137f0d46dc6513e7e429c49b04f67) Signed-off-by: Victor Grousset/tuxayo --- tools/stage-marc-import.pl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/stage-marc-import.pl b/tools/stage-marc-import.pl index 81ea7ab615..6432b64b01 100755 --- a/tools/stage-marc-import.pl +++ b/tools/stage-marc-import.pl @@ -122,10 +122,15 @@ if ($completedJobID) { exit 0; } elsif (defined $pid) { # child - # close STDOUT to signal to Apache that - # we're now running in the background + # close STDOUT/STDERR to signal to end CGI session with Apache + # Otherwise, the AJAX request to this script won't return properly close STDOUT; - # close STDERR; # there is no good reason to close STDERR + close STDERR; + my $logdir = C4::Context->config('logdir'); + if ($logdir && -d $logdir){ + my $logfile = sprintf("%s/%s",$logdir,'background-jobs.log'); + open(STDERR, '>>', $logfile); + } } else { # fork failed, so exit immediately warn "fork failed while attempting to run tools/stage-marc-import.pl as a background job: $!"; -- 2.39.5