Check for childf status

This commit is contained in:
Michael 2021-01-03 22:57:25 +00:00
parent d70d180e4b
commit 74d7d7e164
2 changed files with 21 additions and 9 deletions

View file

@ -223,6 +223,9 @@ while (true) {
$sleep = min(1000000, round(log10($arg) * 1000000, 0)); $sleep = min(1000000, round(log10($arg) * 1000000, 0));
usleep($sleep); usleep($sleep);
$pid = pcntl_waitpid(-1, $status, WNOHANG);
Logger::info('Checked children status via pcntl_waitpid', ['pid' => $pid, 'status' => $status]);
$timeout = ($seconds >= $wait_interval); $timeout = ($seconds >= $wait_interval);
} while (!$timeout && !Worker::IPCJobsExists()); } while (!$timeout && !Worker::IPCJobsExists());

View file

@ -1230,6 +1230,17 @@ class Worker
DI::process()->end(); DI::process()->end();
Logger::info('Worker ended', ['cron' => $do_cron, 'pid' => getmypid()]); Logger::info('Worker ended', ['cron' => $do_cron, 'pid' => getmypid()]);
DBA::disconnect();
/*
$php = '/usr/bin/php';
$param = ['bin/worker.php'];
if ($do_cron) {
$param[] = 'no_cron';
}
pcntl_exec($php, $param);
Logger::warning('Error calling worker', ['cron' => $do_cron, 'pid' => getmypid()]);
*/
exit(); exit();
} }
@ -1242,21 +1253,14 @@ class Worker
*/ */
public static function spawnWorker($do_cron = false) public static function spawnWorker($do_cron = false)
{ {
Logger::notice("Spawn", ['do_cron' => $do_cron, 'callstack' => System::callstack(20)]); if (self::isDaemonMode()) {
// Worker and daemon are started from the command line.
// This means that this is executed by a PHP interpreter without runtime limitations
if (function_exists('pcntl_fork') && in_array(DI::mode()->getExecutor(), [Mode::DAEMON, Mode::WORKER])) {
self::forkProcess($do_cron); self::forkProcess($do_cron);
self::IPCSetJobState(false);
} else { } else {
$process = new Core\Process(DI::logger(), DI::mode(), DI::config(), $process = new Core\Process(DI::logger(), DI::mode(), DI::config(),
DI::modelProcess(), DI::app()->getBasePath(), getmypid()); DI::modelProcess(), DI::app()->getBasePath(), getmypid());
$process->run('bin/worker.php', ['no_cron' => !$do_cron]); $process->run('bin/worker.php', ['no_cron' => !$do_cron]);
} }
// after spawning we have to remove the flag.
if (self::isDaemonMode()) {
self::IPCSetJobState(false);
}
} }
/** /**
@ -1515,6 +1519,11 @@ class Worker
return $daemon_mode; return $daemon_mode;
} }
if (!function_exists('pcntl_fork')) {
self::$daemon_mode = false;
return false;
}
$pidfile = DI::config()->get('system', 'pidfile'); $pidfile = DI::config()->get('system', 'pidfile');
if (empty($pidfile)) { if (empty($pidfile)) {
// No pid file, no daemon // No pid file, no daemon