<?php
+/**
+ * @copyright Copyright (C) 2010-2021, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
namespace Friendica\Core;
use Friendica\App;
-use Friendica\Core\Config\IConfiguration;
+use Friendica\Core\Config\IConfig;
+use Friendica\Model;
use Psr\Log\LoggerInterface;
/**
* - Using an process-id per node
* - Using memory locks for multi-node locking (redis, memcached, ..)
*/
-final class Process
+class Process
{
/**
* @var LoggerInterface
private $mode;
/**
- * @var IConfiguration
+ * @var IConfig
*/
private $config;
*/
private $basePath;
- public function __construct(LoggerInterface $logger, App\Mode $mode, IConfiguration $config, string $basepath)
+ /** @var Model\Process */
+ private $processModel;
+
+ /**
+ * The Process ID of this process
+ *
+ * @var int
+ */
+ private $pid;
+
+ public function __construct(LoggerInterface $logger, App\Mode $mode, IConfig $config, Model\Process $processModel, string $basepath, int $pid)
{
- $this->logger = $logger;
- $this->mode = $mode;
- $this->config = $config;
+ $this->logger = $logger;
+ $this->mode = $mode;
+ $this->config = $config;
$this->basePath = $basepath;
+ $this->processModel = $processModel;
+ $this->pid = $pid;
+ }
+
+ /**
+ * Set the process id
+ *
+ * @param integer $pid
+ * @return void
+ */
+ public function setPid(int $pid)
+ {
+ $this->pid = $pid;
+ }
+
+ /**
+ * Log active processes into the "process" table
+ */
+ public function start()
+ {
+ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
+
+ $command = basename($trace[0]['file']);
+
+ $this->processModel->deleteInactive();
+ $this->processModel->insert($command, $this->pid);
+ }
+
+ /**
+ * Remove the active process from the "process" table
+ *
+ * @return bool
+ * @throws \Exception
+ */
+ public function end()
+ {
+ return $this->processModel->deleteByPid($this->pid);
}
/**
$reached = ($free < $min_memory);
if ($reached) {
- $this->logger->debug('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]);
+ $this->logger->warning('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]);
}
return $reached;
$load = System::currentLoad();
if ($load) {
if (intval($load) > $maxsysload) {
- $this->logger->info('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]);
+ $this->logger->warning('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]);
return true;
}
}
public function run($command, $args)
{
if (!function_exists('proc_open')) {
+ $this->logger->warning('"proc_open" not available - quitting');
return;
}
}
if ($this->isMinMemoryReached()) {
+ $this->logger->warning('Memory limit reached - quitting');
return;
}
$resource = proc_open($cmdline . ' &', [], $foo, $this->basePath);
}
if (!is_resource($resource)) {
- $this->logger->debug('We got no resource for command.', ['cmd' => $cmdline]);
+ $this->logger->warning('We got no resource for command.', ['command' => $cmdline]);
return;
}
proc_close($resource);
+
+ $this->logger->info('Executed "proc_open"', ['command' => $cmdline, 'callstack' => System::callstack(10)]);
}
}