diff options
Diffstat (limited to 'FS/bin')
| -rw-r--r-- | FS/bin/freeside-queued | 50 | 
1 files changed, 36 insertions, 14 deletions
| diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 42d638f4c..1eef00c5c 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -7,7 +7,7 @@ use Fcntl qw(:flock);  use POSIX qw(setsid);  use Date::Format;  use IO::File; -use FS::UID qw(adminsuidsetup); +use FS::UID qw(adminsuidsetup forksuidsetup);  use FS::Record qw(qsearchs);  use FS::queue; @@ -29,6 +29,9 @@ my $user = shift or die &usage;  $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; };  $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; +#pickup zombie status +$SIG{CHLD} = sub { wait; }; +  $> = $FS::UID::freeside_uid unless $>;  $< = $>;  $ENV{HOME} = (getpwuid($>))[7]; #for ssh @@ -61,21 +64,40 @@ while (1) {    my @args = $ljob->args; -  #fork a child for each job (up to some maximum perhaps?) -  #single-threaded for now. - -  my $eval = "&". $ljob->job. '(@args);'; -  warn "running $eval"; -  eval $eval; -  if ( $@ ) { -    warn "job $eval failed"; -    my %hash = $ljob->hash; +  # number of children limit? +  defined( my $pid = fork ) or do { +    warn "WARNING: can't fork: $!\n"; +    my %hash = $job->hash;      $hash{'status'} = 'failed'; -    my $fjob = new FS::queue( \%hash ); -    my $error = $fjob->replace($ljob); +    my $ljob = new FS::queue ( \%hash ); +    my $error = $ljob->replace($job);      die $error if $error; -  } else { -    $ljob->delete; +  }; + +  unless ( $pid ) { #kid time + +    #get new db handles +    $FS::UID::dbh->{InactiveDestroy} = 1; +    $FS::svc_acct::icradius_dbh->{InactiveDestroy} +      if $FS::svc_acct::icradius_dbh; +    forksuidsetup($user); + +    my $eval = "&". $ljob->job. '(@args);'; +    warn "running $eval"; +    eval $eval; +    if ( $@ ) { +      warn "job $eval failed"; +      my %hash = $ljob->hash; +      $hash{'status'} = 'failed'; +      my $fjob = new FS::queue( \%hash ); +      my $error = $fjob->replace($ljob); +      die $error if $error; +    } else { +      $ljob->delete; +    } + +    exit; +    #end-of-kid    }  } continue { | 
