Аддон XF 2.x.x CLI Job / Cron Runner [2.1.1]

CLI Job / Cron Runner
Краткое описание:
реализует усовершенствованный инструмент выполнения заданий и cron-задач через CLI для XenForo 2.x
1
94

Описание CLI Job / Cron Runner:​

Этот аддон реализует усовершенствованный инструмент выполнения заданий и cron-задач через CLI для XenForo 2.x. Он заменяет встроенную команду xf:run-jobs, предоставляя дополнительные функции и гибкость.

Особенности CLI Job / Cron Runner:​

  1. Расширенные возможности выполнения заданий:
    • Обработка заданий и cron-задач до 10 минут за запуск.
    • Использование файла блокировки для предотвращения параллельного выполнения.
    • Подходит для сайтов с высокой нагрузкой.
  2. Диагностика и отладка:
    • Подробный вывод отладочной информации для тестирования и идентификации проблем.
  3. Команды CLI:
    • hg:run-jobs: аналог xf:run-jobs с улучшенным функционалом.
    • hg:show-jobs: отображает все текущие задания.
    • hg:show-crons: отображает все задачи XenForo Cron.
    • hg:run-cron: выполняет указанную задачу Cron.

Требования CLI Job / Cron Runner:​

  • PHP: версия 7.0 или выше.
  • XenForo: версии 2.2 и 2.3.

Установка CLI Job / Cron Runner:​

Установите аддон как обычно.

После установки перейдите на страницу параметров системы и производительности и измените настройку триггера запуска заданий на «Триггер на базе сервера».
1736624697587

Для начала необходимо проверить, что программа запуска заданий работает - выполните следующую команду в CLI:

Bash:
$ php <path to your forum root>/cmd.php hg:run-jobs

Например, если корнем вашего форума является /srv/www/xenforo/community, то команда запуска задания будет такой:
Bash:
$ php /srv/www/xenforo/community/cmd.php hg:run-jobs
Выполнение этой команды приведет к выполнению всех оставшихся заданий, а затем завершится сообщением о том, есть ли еще задания, ожидающие выполнения, или нет. При выполнении этой команды из cron рекомендуется использовать флаг --quiet (или -q) для подавления вывода.

После того как вы убедитесь, что программа запуска заданий работает правильно, вам нужно будет создать собственную задачу cron, чтобы запускать ее по выбранному вами расписанию.

ПРИМЕЧАНИЕ: если у вас уже есть задача cron, настроенная на запуск xf:run-jobs, просто отключите ее и замените идентичной задачей, запускающей вместо нее hg:run-jobs.

Подход № 1 с использованием crontab:​


Настоятельно рекомендуется запускать задачу cron от имени пользователя веб-сервера, чтобы избежать возможных проблем с правами.

Например, на Ubuntu с пользователем веб-сервера www-data установите задачу cron, выполнив следующую команду:
Bash:
$ sudo crontab -u www-data -e
Отредактируйте файл crontab и добавьте:
Bash:
    *       *       *       *       *       php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
Сохраните кронтаб.

Подход № 2 с использованием cron.d:​


Вместо использования кронтаба некоторые дистрибутивы Linux создают хорошо известный каталог, который автоматически проверяется на наличие заданий cron для выполнения. В случае с Ubuntu вы можете создать файлы в /etc/cron.d/, где вы укажете расписание, пользователя, от имени которого будет выполняться команда, и саму команду.

Создайте файл в /etc/cron.d/ со следующим содержимым:
Bash:
* * * * * webserver-user php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
... где webserver-user меняется на имя пользователя, под которым работает ваш веб-сервер, и измените путь к корню форума.

Опять же, используя наш предыдущий пример, где пользователь веб-сервера - www-data, а корень форума -
/srv/www/xenforo/community, я бы выполнил следующую команду для создания файла cron:

Bash:
echo "* * * * * www-data php /srv/www/xenforo/community/cmd.php --quiet hg:run-jobs" | sudo tee -a /etc/cron.d/xenforo
Оба варианта (crontab и cron.d) будут запускать бегунок заданий каждую минуту, проверяя наличие невыполненных заданий.

По умолчанию бегунок запускается максимум на 30 секунд, выполняя все невыполненные задания до тех пор, пока в очереди не останется ни одного выполнимого задания.

Обновление с аддона v1.x после обновления XenForo до версии 2.2​


В версии 2.0 этого аддона изменено имя команды и максимально допустимое время выполнения. Также обратите внимание, что опция --time в v1.x была переименована в --max-execution-time в соответствии с основным исполнителем заданий, представленным в XF v2.2.

Для обновления:​

  1. Обновитесь до XF v2.2 RC2 или более поздней версии
  2. Установите аддон версии 2.0.x
  3. измените запись в вашем unix cron, чтобы он выполнял hg:run-jobs вместо xf:run-jobs
  4. если вы используете опцию --time, переименуйте ее в --max-execution-time
  5. опция --max-execution-time: установите любое значение до 600 секунд (10 минут), чтобы позволить заданию обрабатываться столько, сколько ему нужно. Например: --max-execution-time=180 позволит бегуну заданий выполняться до 3 минут за раз.
Примечание: убедитесь, что в параметрах администратора системы и производительности включен «Триггер на основе сервера».

1736624951083


Конфигурация​

Вы можете настроить максимальное время выполнения задания, указав в командной строке параметр --max-execution-time=[TIME].

Например, чтобы позволить исполнителю выполнять задание не более 45 секунд:
Bash:
$ php <path to your forum root>/cmd.php --max-execution-time=45 hg:run-jobs
Этот аддон использует файлы блокировки для предотвращения одновременного выполнения нескольких команд job runner, что также позволяет нам выполнять команды в течение более длительного времени на загруженных сайтах.

Максимально допустимое время выполнения - 10 минут (600 секунд). Команда будет выполняться до тех пор, пока не найдет больше невыполненных заданий, а затем остановится - поэтому время выполнения обычно составляет всего несколько секунд.


Для дальнейшей настройки выполнения заданий вы также можете отрегулировать максимальное время выполнения каждого задания.
Это настраивается с помощью опции XenForo config.php:
Bash:
$config['jobMaxRunTime'] = 8;
Параметр jobMaxRunTime задает количество времени в секундах, в течение которого задания обработки будут выполняться до того, как они будут приостановлены для дальнейшей обработки в другом проходе, если это возможно. Значение по умолчанию оптимизировано для запуска заданий через браузер, поэтому для того, чтобы задания выполнялись дольше в среде CLI, вам может понадобиться установить более высокое значение.

В общем случае рекомендуется оставить это значение относительно небольшим, чтобы избежать ситуации, когда одно очень длинное задание может помешать своевременному выполнению других заданий. Возможно, потребуется немного поэкспериментировать, чтобы найти оптимальное значение для нагрузки на ваш сервер и размера форума. Если вы сомневаетесь, оставьте значение по умолчанию - 8 секунд.

Использование​


Команда run-jobs должна выполняться автоматически с помощью задачи cron, как указано выше.

Показать задания​


Команда hg:show-jobs выводит список всех текущих заданий, чтобы вы могли видеть, насколько заполнена очередь заданий.

По умолчанию будут показаны только 100 следующих по расписанию заданий, но вы можете использовать опцию --all, чтобы показать полный список всех ожидающих заданий.

Всегда должно отображаться как минимум два задания: основное задание Cron и задание проверки обновлений.
Bash:
$ php cmd.php xf:show-jobs           

2 pending jobs found

+----------------+-----------------+----------------------+----------------------+
| Key            | Class           | Next Run             | Last Run             |
+----------------+-----------------+----------------------+----------------------+
| cron           | XF\Job\Cron     | 11-Apr-2019 10:52:01 | 11-Apr-2019 10:52:31 |
| xfUpgradeCheck | XF:UpgradeCheck | 12-Apr-2019 00:12:21 | 10-Apr-2019 21:24:03 |
+----------------+-----------------+----------------------+----------------------+

The current time is: 11-Apr-2019 10:52:31 (UTC+10:00)
Отладка заданий

Для выявления проблем с заданиями и заданиями Cron существуют обширные инструменты отладки.

Для запуска в режиме отладки сначала отключите Unix cron, который запускает задания автоматически (не забудьте включить его снова, как только закончите отладку!), а затем используйте опции verbosity (Verbose: -v, Very verbose: -vv или Debug: -vv) для команды hg:run-jobs, чтобы указать уровень вывода на консоль.

Вывод осуществляется на консоль и имеет формат, аналогичный тому, который используется библиотекой Monolog (хотя мы не используем Monolog для генерации вывода).

Например, опция Verbose -v:

Bash:
$ php cmd.php hg:run-jobs -v
[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\CleanUp::runUserDowngrade executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\LogDigest\Cron\SendLogs::serverError executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.03 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomMediaCache executed in 0.07 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\EmailBounce::process executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Job executed in 0.20 seconds

No more runnable jobs pending
Опция Very Verbose -vv добавляет контекст, обычно о результатах задания:

Bash:
$ php cmd.php hg:run-jobs -vv
[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.01 seconds {"entry_id":"slackNotifyServerErrors","cron_class":"Hampel\\Slack\\Cron\\NotifyLogs","cron_method":"notify","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":-1}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/Slack"}

[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\SparkPost\Cron\MessageEvents::fetchMessageEvents executed in 0.00 seconds {"entry_id":"sparkpostMessageEvents","cron_class":"Hampel\\SparkPost\\Cron\\MessageEvents","cron_method":"fetchMessageEvents","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":19,"1":49}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/SparkPost"}

[2019-11-27 23:49:49] XF\Job\Cron: Job executed in 0.03 seconds {"completed":false,"jobId":2,"continueDate":1574898603,"continueDate_formatted":"2019-11-27 23:50:03 UTC","statusMessage":"Running... Cron entries"}

[2019-11-27 23:49:49] Hampel\SparkPost:MessageEvent: Job executed in 0.83 seconds {"completed":true,"jobId":12,"continueDate":null,"continueDate_formatted":"","statusMessage":""}

No more runnable jobs pending
И, наконец, опция Debug -vv добавляет дополнительную информацию о задании:

Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds {"entry_id":"feeder","cron_class":"XF\\Cron\\Feeder","cron_method":"importFeeds","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":2,"1":12,"2":22,"3":32,"4":42,"5":52}},"active":true,"next_run":1574879524,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds {"entry_id":"forumStatistics","cron_class":"XF\\Cron\\Counters","cron_method":"rebuildForumStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":3,"1":13,"2":23,"3":33,"4":43,"5":53}},"active":true,"next_run":1574879584,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.03 seconds {"entry_id":"memberStatsCache","cron_class":"XF\\Cron\\MemberStats","cron_method":"rebuildMemberStatsCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":0,"1":10,"2":20,"3":30,"4":40,"5":50}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Trophy::runTrophyCheck executed in 0.00 seconds {"entry_id":"trophy","cron_class":"XF\\Cron\\Trophy","cron_method":"runTrophyCheck","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":40}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\Statistics::cacheGalleryStatistics executed in 0.01 seconds {"entry_id":"xfmgCacheStats","cron_class":"XFMG\\Cron\\Statistics","cron_method":"cacheGalleryStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":10,"1":40}},"active":true,"next_run":1574880004,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\CleanUp::expireTempUserChanges executed in 0.00 seconds {"entry_id":"expireTempUserChanges","cron_class":"XF\\Cron\\CleanUp","cron_method":"expireTempUserChanges","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":42}},"active":true,"next_run":1574880124,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomAlbumCache executed in 0.02 seconds {"entry_id":"xfmgGenerateRandomAlbum","cron_class":"XFMG\\Cron\\RandomCache","cron_method":"generateRandomAlbumCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":12,"1":42}},"active":true,"next_run":1574880124,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\EmailUnsubscribe::process executed in 0.00 seconds {"entry_id":"emailUnsubscribe","cron_class":"XF\\Cron\\EmailUnsubscribe","cron_method":"process","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":13,"1":43}},"active":true,"next_run":1574880184,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Ban::deleteExpiredBans executed in 0.01 seconds {"entry_id":"deleteExpiredBans","cron_class":"XF\\Cron\\Ban","cron_method":"deleteExpiredBans","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":45}},"active":true,"next_run":1574880304,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Job executed in 0.32 seconds {"completed":false,"jobId":2,"continueDate":1574898543,"continueDate_formatted":"2019-11-27 23:49:03 UTC","statusMessage":"Running... Cron entries"} {"job_id":2,"unique_key":"cron","execute_class":"XF\\Job\\Cron","execute_data":{},"manual_execute":0,"trigger_date":1574879464,"last_run_date":1574879405,"trigger_date_formatted":"2019-11-27 18:31:04 UTC","last_run_date_formatted":"2019-11-27 18:30:05 UTC"}

[2019-11-27 23:48:03] Hampel\SparkPost:MessageEvent: Job executed in 0.90 seconds {"completed":true,"jobId":10,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":10,"unique_key":"SparkPostMessageEvents","execute_class":"Hampel\\SparkPost:MessageEvent","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

[2019-11-27 23:48:03] Hampel\SparkPost:EmailBounce: Job executed in 0.02 seconds {"completed":true,"jobId":11,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":11,"unique_key":"SparkPostEmailBounce","execute_class":"Hampel\\SparkPost:EmailBounce","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

No more runnable jobs pending

Отладка пользовательских заданий​


Вы можете добавить дополнительную отладку в свои пользовательские задания.

Добавьте в класс задания следующую функцию для вызова функции logJobProgress нашего класса Logger:
PHP:
    protected function log($message, array $context = [])
    {
        // check to see if we actually have a logger available and abort if not
        if (!isset($this->app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = $this->app['cli.logger'];
        $logger->logJobProgress($message, $context, $this);
    }
Затем вы можете вызвать функцию log() в коде задания, чтобы отправить информацию в консоль, когда Job Runner выполняется в режиме verbose.

Например, смотрите тестовое задание, включенное в этот аддон Hampel\JobRunner\Job\TestJob:

PHP:
    public function run($maxRunTime)
    {
        $this->log("About to start test job", $this->data);

        $mail = $this->app->mailer()->newMail();
        $mail->setTo($this->data['email']);
        $mail->setContent(
            "Test job",
            "This is an email sent from a test job"
        );
        $sent = $mail->send();

        $this->log("Sent mail", ['sent' => $sent]);

        return $this->complete();
    }
Приведенный выше код сгенерирует следующий вывод, когда Job Runner находится в режиме отладки:

Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: About to start test job {"email":"[email protected]"} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.00"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Sent mail {"sent":1} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.95"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Job executed in 0.95 seconds {"completed":true,"jobId":17,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":17,"unique_key":null,"execute_class":"Hampel\\JobRunner:TestJob","execute_data":{"email":"[email protected]"},"manual_execute":0,"trigger_date":1574900777,"last_run_date":null,"trigger_date_formatted":"2019-11-28 00:26:17 UTC","last_run_date_formatted":""}

No more runnable jobs pending
При запуске в тихом режиме не будет показано никаких результатов, и, что более важно, если этот аддон будет отключен, код ведения журнала не нужно будет удалять. Важной частью является строка if (!isset(\XF::app['cli.logger'])) return;, которая прервет работу, если наш логгер недоступен.

Отладка пользовательских задач Cron​


Используя аналогичный механизм, мы можем добавить отладочный код и в наши пользовательские задачи Cron:

Добавьте в свои задачи Cron немного другую функцию для вызова функции log() нашего класса Logger:
PHP:
    protected static function log($message, array $context = [])
    {
        // check to see if we actually have a logger available and abort if not
        if (!isset(\XF::app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = \XF::app['cli.logger'];
        $logger->log("XF\Job\Cron", $message, $context);
    }
Затем просто вызовите что-то вроде: self::log(«some message about something happening», ['key' => 'value']); в своем коде, чтобы вывести информацию на консоль, когда Job Runner выполняется в режиме verbose.

Трейт Logger

Существует также трейт, который вы можете включить в свои классы: Hampel\JobRunner\Cli\LoggerTrait, который реализует некоторые базовые функции ведения журнала, которые вы можете вызывать из своего кода:
  • getLogger
  • log
  • logQuiet (будет показан, даже если для Job Runner указана опция -q) - используйте только для критических ошибок
  • logNormal (будет отображаться при отсутствии многозначности и выше)
  • logVerbose (будет показан только для опции -v или выше)
  • logVeryVerbose (будет показан только для опции -vv или выше)
  • debug (будет отображаться только в том случае, если для бегуна заданий указан параметр -vv)
Нет необходимости удалять код логирования или отладки из аддона при развертывании - при запуске hg:run-jobs в нормальном или тихом режиме ничего из выводимых данных не будет показано, если только не использовать logNormal или logQuiet (которые следует использовать только для ошибок).

Отладка задач Cron​


Начиная с версии 2.0 beta 3, появились две новые команды для работы с задачами XF cron:

Show Crons​


Команда hg:show-crons выводит список всех активных задач XF cron
Bash:
$ cmd.php hg:show-crons

19 active cron entries found

+---------------------------+----------------------+--------------------------+
| ID                        | Next Run (UTC+10:00) | Addon                    |
+---------------------------+----------------------+--------------------------+
| forumStatistics           | 29-Sep-2020 06:53    | XF                       |
| emailBounce               | 29-Sep-2020 06:53    | XF                       |
| warningExpiry             | 29-Sep-2020 06:55    | XF                       |
| rebuildSearchForumCache   | 29-Sep-2020 07:00    | XF                       |
| memberStatsCache          | 29-Sep-2020 07:00    | XF                       |
| feeder                    | 29-Sep-2020 07:02    | XF                       |
| cleanUpHourly             | 29-Sep-2020 07:10    | XF                       |
| emailUnsubscribe          | 29-Sep-2020 07:13    | XF                       |
| userGroupPromotions       | 29-Sep-2020 07:20    | XF                       |
| views                     | 29-Sep-2020 07:30    | XF                       |
| trophy                    | 29-Sep-2020 07:40    | XF                       |
| expireTempUserChanges     | 29-Sep-2020 07:42    | XF                       |
| deleteExpiredBans         | 29-Sep-2020 07:45    | XF                       |
| downgradeExpired          | 29-Sep-2020 07:50    | XF                       |
| fileCheck                 | 29-Sep-2020 10:10    | XF                       |
| dailyStats                | 29-Sep-2020 10:30    | XF                       |
| cleanUpDaily              | 29-Sep-2020 13:00    | XF                       |
| activitySummaryEmail      | 30-Sep-2020 00:20    | XF                       |
| sitemap                   | 30-Sep-2020 15:37    | XF                       |
+---------------------------+----------------------+--------------------------+

The current time is: 29-Sep-2020 06:52:05 (UTC+10:00)
В командной строке можно указать три параметра:
  • -a или --all показывает все задачи cron, включая отключенные задачи
  • -m или --method включает класс::метод для каждой задачи cron
  • -s или --sort задает колонку сортировки списка (дата, id или addon).
Вы можете использовать этот инструмент для быстрого определения идентификатора задачи cron, которую вы хотите запустить - который вы затем используете в другой новой команде ...

Запуск Cron​

Команда hg:run-cron выполнит задачу XF cron - просто укажите в качестве аргумента идентификатор cron.
Например: cmd.php hg:run-cron activitySummaryEmail запустит cron-задачу «Отправка сводки активности по электронной почте».
По умолчанию отключенные задачи cron не могут быть запущены, поэтому вы можете отменить это, указав в командной строке опцию -f или --force.
Здесь работают те же флаги многословия, поэтому укажите -v, -vv или -vv, чтобы получить необходимый уровень вывода.

Автор

bobobo

Еще ресурсы от bobobo

Password Tools
Улучшает безопасность паролей пользователей
Standard Library by Xon
Библиотека для аддонов автора
Attachment Improvements By Xon
Attachment Improvements By Xon
Коллекция улучшений для системы вложений XenForo, включая поддержку видео, SVG
Spartan Anti-Cheat
Spartan Anti-Cheat
Античит с машинным обучением для Minecraft.
GadgetsMenu [Premium]
GadgetsMenu [Premium]
Более 550+ косметических предметов! Анимированные шляпы, костюмы, гаджеты, миниатюры, плащи и многое
CustomNameplates
CustomNameplates
Уникальный способ кастомизации ников и разговорных пузырьков.
AdvancedSeasons
AdvancedSeasons
#Advanced
AdvancedPets
AdvancedPets
15+ захватывающих питомцев - Пользовательские 3D питомцы - Повышение уровня - 60+ способностей - Ски
AdvancedModels - Minecraft Models Plugin
AdvancedModels - Minecraft Models Plugin
25+ Мебели - Создание моделей в Minecraft с помощью Blockbench без ресурс-пака - Соответствует EULA
AdvancedEnchantments
AdvancedEnchantments
200+ кастомных чар - таблица чар и поддержка наковальни - 20+ предметов
2FA Guard - Ultimate Minecraft 2FA Plugin (2 Factor Authentication Plugin)
2FA Guard - Ultimate Minecraft 2FA Plugin (2 Factor Authentication Plugin)
Лучший плагин для Minecraft 2FA (двухфакторная аутентификация) для Spigot, Bungeecord и Velocity
ВерхНиз