From 9ced0509261dacaa617c39d32ed2c2a4297f0cb2 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Tue, 18 Aug 2009 05:33:45 +0000 Subject: Bug 509539: Allow jobqueue.pl to specify where it stores its PID Patch by Max Kanat-Alexander r=dkl, a=mkanat --- Bugzilla/JobQueue/Runner.pm | 56 +++++++++++++++++++++++++++++++++++++-------- jobqueue.pl | 9 +++++++- 2 files changed, 55 insertions(+), 10 deletions(-) mode change 100644 => 100755 jobqueue.pl diff --git a/Bugzilla/JobQueue/Runner.pm b/Bugzilla/JobQueue/Runner.pm index ec2719638..3c392209a 100644 --- a/Bugzilla/JobQueue/Runner.pm +++ b/Bugzilla/JobQueue/Runner.pm @@ -35,18 +35,56 @@ use Bugzilla::JobQueue; use Bugzilla::Util qw(get_text); BEGIN { eval "use base qw(Daemon::Generic)"; } -# Required because of a bug in Daemon::Generic where it won't use the -# "version" key from DAEMON_CONFIG. our $VERSION = BUGZILLA_VERSION; -use constant DAEMON_CONFIG => ( - progname => basename($0), - pidfile => bz_locations()->{datadir} . '/' . basename($0) . '.pid', - version => BUGZILLA_VERSION, -); - +# The Daemon::Generic docs say that it uses all sorts of +# things from gd_preconfig, but in fact it does not. The +# only thing it uses from gd_preconfig is the "pidfile" +# config parameter. sub gd_preconfig { - return DAEMON_CONFIG; + my $self = shift; + + my $pidfile = $self->{gd_args}{pidfile}; + if (!$pidfile) { + $pidfile = bz_locations()->{datadir} . '/' . $self->{gd_progname} + . ".pid"; + } + return (pidfile => $pidfile); +} + +# All config other than the pidfile has to be done in gd_getopt +# in order for it to be set up early enough. +sub gd_getopt { + my $self = shift; + + $self->SUPER::gd_getopt(); + + if ($self->{gd_args}{progname}) { + $self->{gd_progname} = $self->{gd_args}{progname}; + } + else { + $self->{gd_progname} = basename($0); + } + + # There are places that Daemon Generic's new() uses $0 instead of + # gd_progname, which it really shouldn't, but this hack fixes it. + $self->{_original_zero} = $0; + $0 = $self->{gd_progname}; +} + +sub gd_postconfig { + my $self = shift; + # See the hack above in gd_getopt. This just reverses it + # in case anything else needs the accurate $0. + $0 = delete $self->{_original_zero}; +} + +sub gd_more_opt { + my $self = shift; + return ( + 'pidfile=s' => \$self->{gd_args}{pidfile}, + 'n=s' => \$self->{gd_args}{progname}, + ); } sub gd_usage { diff --git a/jobqueue.pl b/jobqueue.pl old mode 100644 new mode 100755 index ad0c81f85..eae05456a --- a/jobqueue.pl +++ b/jobqueue.pl @@ -37,10 +37,17 @@ jobqueue.pl - Runs jobs in the background for Bugzilla. =head1 SYNOPSIS - ./jobqueue.pl [ -f ] [ -d ] { start | stop | restart | check | help | version } + ./jobqueue.pl [OPTION] { start | stop | restart | check | help | version } + OPTIONS: -f Run in the foreground (don't detach) -d Output a lot of debugging information + -p file Specify the file where jobqueue.pl should store its current + process id. Defaults to F. + -n name What should this process call itself in the system log? + Defaults to the full path you used to invoke the script. + + COMMANDS: start Starts a new jobqueue daemon if there isn't one running already stop Stops a running jobqueue daemon restart Stops a running jobqueue if one is running, and then -- cgit v1.2.3-24-g4f1b