addDescription( 'Run pending jobs' ); $this->addOption( 'maxjobs', 'Maximum number of jobs to run', false, true ); $this->addOption( 'maxtime', 'Maximum amount of wall-clock time', false, true ); $this->addOption( 'type', 'Type of job to run', false, true ); $this->addOption( 'procs', 'Number of processes to use', false, true ); $this->addOption( 'nothrottle', 'Ignore job throttling configuration', false, false ); $this->addOption( 'result', 'Set to "json" to print only a JSON response', false, true ); $this->addOption( 'wait', 'Wait for new jobs instead of exiting', false, false ); } public function memoryLimit() { if ( $this->hasOption( 'memory-limit' ) ) { return parent::memoryLimit(); } // Don't eat all memory on the machine if we get a bad job. return "150M"; } public function execute() { if ( $this->hasOption( 'procs' ) ) { $procs = intval( $this->getOption( 'procs' ) ); if ( $procs < 1 || $procs > 1000 ) { $this->fatalError( "Invalid argument to --procs" ); } elseif ( $procs != 1 ) { $fc = new ForkController( $procs ); if ( $fc->start() != 'child' ) { exit( 0 ); } } } $outputJSON = ( $this->getOption( 'result' ) === 'json' ); $wait = $this->hasOption( 'wait' ); $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) ); if ( !$outputJSON ) { $runner->setDebugHandler( [ $this, 'debugInternal' ] ); } $type = $this->getOption( 'type', false ); $maxJobs = $this->getOption( 'maxjobs', false ); $maxTime = $this->getOption( 'maxtime', false ); $throttle = !$this->hasOption( 'nothrottle' ); while ( true ) { $response = $runner->run( [ 'type' => $type, 'maxJobs' => $maxJobs, 'maxTime' => $maxTime, 'throttle' => $throttle, ] ); if ( $outputJSON ) { $this->output( FormatJson::encode( $response, true ) ); } if ( !$wait || $response['reached'] === 'time-limit' || $response['reached'] === 'job-limit' || $response['reached'] === 'memory-limit' ) { break; } if ( $maxJobs !== false ) { $maxJobs -= count( $response['jobs'] ); } sleep( 1 ); } } /** * @param string $s */ public function debugInternal( $s ) { $this->output( $s ); } } $maintClass = RunJobs::class; require_once RUN_MAINTENANCE_IF_MAIN;