diff options
author | ivan <ivan> | 2001-09-11 00:08:18 +0000 |
---|---|---|
committer | ivan <ivan> | 2001-09-11 00:08:18 +0000 |
commit | f5266a4d07d116efd732f433d0f4f3a47b143a7d (patch) | |
tree | 30b5bd95a9d3b3c588ab097f1877ae0d27e96741 /FS/bin/freeside-queued | |
parent | 85e59606c0b5eed9780534ffaf554aa32bcf9baf (diff) |
faster (cached) fuzzy searches
prelim. job queues!
fixed part_svc editing
Diffstat (limited to 'FS/bin/freeside-queued')
-rw-r--r-- | FS/bin/freeside-queued | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued new file mode 100644 index 000000000..5acffb52c --- /dev/null +++ b/FS/bin/freeside-queued @@ -0,0 +1,145 @@ +#!/usr/bin/perl -w + +use strict; +use Fcntl qw(:flock); +use POSIX qw(setsid); +use FS::UID qw(adminsuidsetup); +use FS::Record qw(qsearchs); +use FS::queue; + +# no autoloading just yet +use FS::cust_main; + +my $pid_file = '/var/run/freeside-queued.pid'; + +$SIG{CHLD} = sub { wait }; #zombie prevention + +my $sigterm = 0; +my $sigint = 0; +$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; +$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; + +my $user = shift or die &usage; + +&daemonize; + +my $log_file = "/usr/local/etc/freeside/queuelog."; + +$> = $FS::UID::freeside_uid unless $>; +adminsuidsetup $user; + +$log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; + +$SIG{__DIE__} = \&_die; +$SIG{__WARN__} = \&_logmsg; + + +while (1) { + + my $job = qsearchs( + 'queue', + { 'status' => 'new' }, + '', + 'ORDER BY jobnum FOR UPDATE LIMIT 1' + ) or do { + sleep 5; + next; + }; + + my %hash = $job->hash; + $hash{'status'} = 'locked'; + my $ljob = new FS::queue ( \%hash ); + my $error = $ljob->replace($job); + die $error if $error; + + 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; + $hash{'status'} = 'failed'; + my $fjob = new FS::queue( \%hash ); + my $error = $fjob->replace($ljob); + die $error if $error; + } else { + $ljob->delete; + } + +} continue { + if ( $sigterm ) { + warn "received TERM signal; exiting\n"; + exit; + } + if ( $sigint ) { + warn "received INT signal; exiting\n"; + exit; + } +} + + +sub datestamp { + time2str("%m%d%Y", time); +} + +sub _die { + my $msg = shift; + unlink $pid_file if -e $pid_file; + _logmsg($msg); +} + +sub _logmsg { + chomp( my $msg = shift ); + my $log = new IO::File ">>$log_file"; + flock($log, LOCK_EX); + seek($log, 0, 2); + print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n"; + flock($log, LOCK_UN); +} + +sub daemonize { + + chdir "/" or die "Can't chdir to /: $!"; + open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; + defined(my $pid = fork) or die "Can't fork: $!"; + if ( $pid ) { + print "freeside-queued started with pid $pid\n"; #logging to $log_file\n"; + exit unless $pid_file; + my $pidfh = new IO::File ">$pid_file" or exit; + print $pidfh "$pid\n"; + exit; + } + open STDOUT, '>/dev/null' + or die "Can't write to /dev/null: $!"; + setsid or die "Can't start a new session: $!"; + open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; + +} + +=head1 NAME + +freeside-queued - Job queue daemon + +=head1 SYNOPSIS + + freeside-queued user + +=head1 DESCRIPTION + +Job queue daemon. Should be running at all times. + +user: from the mapsecrets file - see config.html from the base documentation + +=head1 VERSION + +=head1 BUGS + +=head1 SEE ALSO + +=cut + |