diff options
| author | ivan <ivan> | 2001-09-24 03:23:34 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2001-09-24 03:23:34 +0000 | 
| commit | a08b4d18bc28e44fe236f1060632ffefc773f78b (patch) | |
| tree | e561862de4dc27ce045e702fdcbb62d0f4ffbbfe /FS/bin | |
| parent | 6e66ba42e0a4ddd87e1491ad23a8fb4de0241ffd (diff) | |
queue daemon forks now
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 { | 
