public function process() : void
    {
        global $argv;
        $specific = null;
        foreach ($argv as $arg) {
            if (preg_match('@--job=(.*?)$@', $arg, $match)) {
                $specific = $match[1];
            }
        }
        $start = time();
        $tmp = sys_get_temp_dir();
        array_walk($this->jobs, function ($job, $idx) use ($tmp, $specific, $argv) {
            if (isset($specific) && $specific !== $idx) {
                return;
            }
            if (in_array('--verbose', $argv) || in_array('-v', $argv)) {
                echo "Starting $idx...";
            }
            $fp = fopen("$tmp/".md5($idx).'.lock', 'w+');
            flock($fp, LOCK_EX);
            try {
                $job->call($this);
            } catch (NotDueException $e) {
            } catch (Exception $e) {
                $this->logger->addCritial(sprintf(
                    "%s in file %s on line %d",
                    $e->getMessage(),
                    $e->getFile(),
                    $e->getLine()
                ));
            }
            flock($fp, LOCK_UN);
            fclose($fp);
            if (in_array('--verbose', $argv) || in_array('-v', $argv)) {
                echo " [done]\n";
            }
        });
        if (--$this->minutes > 0) {
            $wait = max(60 - (time() - $start), 0);
            if (!getenv('TOAST')) {
                sleep($wait);
            }
            $this->now += 60;
            $this->process();
        }
    }