NodeJS | PM2 не останавливает setInterval() после clearInterval() — efim360.ru

NodeJS | PM2 не останавливает setInterval() после clearInterval()

На сервере

Тестировал примитивное приложение для NodeJS, которое выводит console.log() через связку из создания интревального таймера setInterval() и его отключения clearInterval(). Выглядит оно так:

let a = 1;

function a5(){

    if(a>=5){

        console.log('a больше или равно 5', a);

        clearInterval(x);

        console.log(`Таймер${x} удалён`);

        return;

    }

    console.log('a меньше 5', a);

    a += 1;

};

let x = setInterval(a5, 2000);

 

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

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

После вызова в операционной системе Debian команды pm2 monit от процессного менеджера PM2, открывается терминальный "PM2 Dashboard". В нём экран поделён на 4 зоны. Первая (слева вверху) отображает приложения и их статусы. Вторая (справа вверху) отображает Логи (Журналы), которые поступают из приложения, если есть команды console.log() или console.error(). Переход между приложениями осуществляется стрелками вверх и вниз на клавиатуре в активной первой зоне.

И в нашем случае мы отчётливо видим, как после "нормального завершения" нашего приложения, PM2 заново стартует это же самое приложение. Логи продолжают писаться как ни в чём не бывало.

Здесь очень важно обратить внимание на Четвёртую зону (справа внизу). В ней есть два пункта:

  • Restarts (Количество перезапусков)
  • Uptime (Время активной работы текущего перезапуска)

Именно эти значения и дают ответ нам на вопрос, почему clearInterval() не останавливает таймер. На самом деле останавливает, просто PM2 очень быстро заново запускает свежий вариант того же приложения.

 

На клиенте

Похожей ситуации нельзя встретить в браузере:

Интервальный таймер отработал и окончательно завершился в браузере - JavaScript
Интервальный таймер отработал и окончательно завершился в браузере - JavaScript

В браузере этот скрипт отработает один раз и больше не запустится самостоятельно.

 

Информационные ссылки

NodeJS | Таймеры

Стандарт NodeJS - Модуль "Timers" - https://nodejs.org/dist/latest-v18.x/docs/api/timers.html

Менеджер процессов PM2 - https://pm2.keymetrics.io