From 79d68c4f2a14b5401a4eda83cb0069a5c87387ca Mon Sep 17 00:00:00 2001 From: Alex Buckley Date: Sat, 25 Aug 2018 23:53:21 +1200 Subject: [PATCH] Bug 15529 - Lock /var/lock/koha//messagequeue.lock while running process_message_queue.pl The script loops through every enabled instance. It checks if the messagequeue.lock file is locked in the instance directory. If not then the cronjob runs. If the lock file is locked then this is logged and a email is sent out. Test plan: 1. In two terminals open koha-shell and try to run ./process_message_queue.pl and notice you can run the script multiple times simulataneously without a warning/error being displayed 2. Apply patch 3. Repeast step 1 and notice that the second of the two scripts to be run will output text saying './process_message_queue.pl is already running. Exiting' In this case the aforementioned text is displayed and the body of the cronjob is not run. 4. The first cronjob script to run, runs without issues Sponsored-By: Parliament Library --- misc/cronjobs/process_message_queue.pl | 60 +++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/misc/cronjobs/process_message_queue.pl b/misc/cronjobs/process_message_queue.pl index 93f5c35..a0dcf2d 100755 --- a/misc/cronjobs/process_message_queue.pl +++ b/misc/cronjobs/process_message_queue.pl @@ -28,6 +28,12 @@ BEGIN { use C4::Letters; use C4::Log; use Getopt::Long; +use MIME::Lite; +use Mail::Sendmail; +use Encode; +use Net::SMTP; + +use Fcntl ':flock'; my $username = undef; my $password = undef; @@ -68,14 +74,50 @@ die $usage if $help; cronlogaction(); -C4::Letters::SendQueuedMessages( - { - verbose => $verbose, - username => $username, - password => $password, - method => $method, - limit => $limit, - type => $type, +print "start of program\n"; + +foreach my $instance (`koha-list --enabled`) { + chomp $instance; + my $instancemessagequeuefile = "/var/lock/koha/" . $instance . "/messagequeue.lock"; + + + open(FOO, ">> $instancemessagequeuefile") or die "Cannot write to $instancemessagequeuefile: $!"; + print "Getting the lock\n"; + + unless (flock ( FOO, LOCK_EX|LOCK_NB )) { + print "$0 is already running. Exiting.\n"; + + #Send email to inform administrator another process_message_queue.pl cron was attempted to run whilst previous execution of the file is taking place. + # Configure accordingly + MIME::Lite->send( 'smtp', 'mail.catalyst.net.nz'); + + + my $email = MIME::Lite->new( + To => ' ', + From => ' ', + Type => 'TEXT', + Subject => 'process_message_queue.pl cron is already running', + Data => 'process_message_queue.pl cron is already running', + ); + + $email->attach( + Type => 'Text', + Data => 'process_message_queue.pl cron is already running', + ); + + $email->send(); + exit(1); } -); + C4::Letters::SendQueuedMessages( + { + verbose => $verbose, + username => $username, + password => $password, + method => $method, + limit => $limit, + type => $type, + } + ); + print "End of process_message_queue.pl cron process"; +} -- 2.1.4