PM2 для управления процессами

PM2 представляет собой зрелый инструмент для управления долгоживущими Node.js-процессами, их автоматического перезапуска, логирования и мониторинга. В контексте автоматизации и тестирования с Puppeteer PM2 выступает надёжным механизмом запуска браузерных задач в фоне и их устойчивого выполнения под нагрузкой.

Основные возможности PM2

  • Автоматический рестарт при падениях и ошибках.
  • Горячее обновление без простоя (graceful reload) для кластерных приложений.
  • Ротация логов и централизованное управление выводом.
  • Отдельные конфигурации окружений для разработки, тестирования и продакшн-сценариев.
  • Мониторинг метрик (память, CPU, аптайм).
  • Поддержка декларативных конфигов (ecosystem.config.js) с несколькими процессами.

Особое значение имеют устойчивость и логирование. Проблемы вроде зависшего Chromium, утечек памяти или длительных соединений часто проявляются в тестовых лабораториях с Puppeteer. PM2 обеспечивает рестарт процесса и сбор диагностических данных, уменьшая риск простоя.

Установка и базовое управление

Установка производится глобально через npm и занимает минимум времени:

npm install -g pm2

Запуск локального скрипта с Puppeteer:

pm2 start run-tests.js --name="puppeteer-tests"

Проверка состояния:

pm2 status

Просмотр логов:

pm2 logs puppeteer-tests

Перезапуск:

pm2 restart puppeteer-tests

Удаление процесса:

pm2 delete puppeteer-tests

Эти операции образуют минимальный набор действий при отладке и сопровождении автоматизационных задач.

Конфигурация через ecosystem файл

Ecosystem-файл позволяет описывать несколько процессов в декларативной форме. Это особенно удобно при наличии набора взаимосвязанных тестовых сервисов и вспомогательных воркеров.

Пример ecosystem.config.js для Puppeteer-сценариев:

module.exports = {
  apps: [
    {
      name: &
      script: './runner.js',
      instances: 1,
      exec_mode: 'fork',
      env: {
        NODE_ENV: 'development'
      },
      env_production: {
        NODE_ENV: 'production'
      },
      max_memory_restart: '600M',
      out_file: './logs/runner.out.log',
      error_file: './logs/runner.err.log'
    }
  ]
};

Ключевые элементы:

  • instances и exec_mode управляют режимом исполнения. Для Puppeteer чаще выбирается fork, поскольку Chromium плохо масштабируется в режиме кластера.
  • max_memory_restart полезен для контроля утечек памяти при долгой работе браузера.
  • out_file и error_file обеспечивают раздельное логирование стандартного вывода и ошибок.
  • Разделы env и env_production позволяют настраивать тестовые и продакшн-окружения.

Запуск по ecosystem-файлу:

pm2 start ecosystem.config.js --env production

Работа с логами и ротацией

Puppeteer активно пишет диагностические сообщения, а Chromium формирует значительные объёмы системного вывода. Логирование под PM2 делает их доступными для анализа:

pm2 logs

Для ротации существует встроенный модуль:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

Ротация решает проблемы переполнения диска при длительных нагрузочных тестах.

Автовосстановление и аптайм

Использование restart_delay и max_restarts помогает контролировать частоту перезапусков. При наличии нестабильных сетевых тестов это важно для общей устойчивости стенда.

Пример:

{
  name: 'puppeteer-worker',
  script: './worker.js',
  restart_delay: 2000,
  max_restarts: 10
}

Такая конфигурация предотвращает бесконечные циклы рестартов и вместе с тем даёт процессу возможность восстановиться после временного сбоя.

Интеграция с кластеризацией и нагрузкой

При распространённых сценариях массового параллельного рендеринга или скрейпинга Puppeteer требователен к ресурсам. PM2 позволяет распределять задачи по процессам, а не по потокам, избегая конфликтов Chromium и снижая риск взаимного влияния. Регулировка количества инстансов производится через instances, но на практике для браузера предпочтителен один процесс на одно ядро или даже меньше, в зависимости от потребления памяти.

Управление как сервис

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

pm2 startup
pm2 save

Такой режим подходит для длительных e2e-лабораторий, CI-стендов и аналитических воркеров на Puppeteer.

Мониторинг и диагностика

Команда pm2 monit визуализирует использование CPU и памяти, что позволяет отслеживать аномалии в реальном времени. Для Puppeteer подобные метрики важны, поскольку Chromium склонен к росту потребления памяти при длительных тестах.

Также PM2 предоставляет HTTP API и интеграцию с внешними системами мониторинга. Это облегчает построение наблюдаемости в распределённых стендах.

Комбинация PM2 и CI/CD

PM2 органично вписывается в конвейеры CI/CD. Запуск тестов может происходить одновременно с сервисами, которые Puppeteer использует в процессе тестирования (например, dev-сервер фронтенда). Ecosystem-файл делает конфигурацию воспроизводимой и переносимой между машинами.

Отдельная польза заключается в том, что PM2 позволяет хранить конфигурацию тестовых раннеров в репозитории, упрощая инфраструктурные задачи и уменьшая риск «дрейфа окружений».

Безопасность и изоляция

Работа Puppeteer с реальным браузером требует учёта безопасного завершения процессов Chromium. PM2 обеспечивает корректные сигналы завершения (SIGINT, SIGTERM) и даёт возможность использовать graceful shutdown в коде, закрывая браузеры и соединения перед остановкой.

Дополнительно можно применять пространства имён и докеризацию. PM2 остаётся ответственным за управление процессом внутри контейнера, тогда как контейнер обеспечивает сетевую и файловую изоляцию.

Практические рекомендации

  • Для долгоживущих тестовых раннеров задаётся max_memory_restart, чтобы предотвращать накопление утечек памяти.
  • Логи Puppeteer и Chromium выводятся в отдельные файлы для упрощения анализа.
  • Настраивается restart_delay для смягчения последствий нестабильных сетей или тестов.
  • Использование ecosystem-файла предпочтительно, поскольку оно делает конфигурацию декларативной.

PM2 формирует надежный фундамент для сопровождения процессов Puppeteer, делая тестовые стенды устойчивыми, управляемыми и воспроизводимыми как в разработке, так и в CI-практиках.