1 minute read

Если ты запустил скрипт через npm script (например, npm run my-script), и внутри него используется setInterval, то он продолжает выполняться до тех пор, пока ты его явно не остановишь.

Способы остановки:

  1. Нажать Ctrl+C в терминале.
    • Это стандартный способ прерывания процесса. Подходит, если ты запускаешь скрипт вручную и хочешь остановить его быстро.
  2. Kill process.
    • Если ты запустил скрипт в фоновом режиме (например, через npm run my-script & на Unix-системах), то тебе нужно:
      • Найти PID процесса: ps aux | grep node (Linux/Mac) или tasklist | findstr node (Windows).
      • Убить процесс: kill PID (Linux/Mac) или taskkill /PID PID /F (Windows).
  3. Использовать явную остановку через код.

    В твоём скрипте можно предусмотреть условие остановки, например:

    const intervalId = setInterval(() => {
      console.log("Работает...");
    }, 1000);
    
    // Останавливаем через 5 секунд
    setTimeout(() => {
      clearInterval(intervalId);
      console.log("Скрипт остановлен.");
      process.exit(0); // Завершение процесса
    }, 5000);
    

    Этот способ позволяет управлять завершением процесса программно.

  4. Использовать сигналы (например, SIGINT).

    В Node.js можно обработать нажатие Ctrl+C или другие сигналы:

    process.on("SIGINT", () => {
      console.log("Получен сигнал SIGINT. Завершение...");
      process.exit(0);
    });
    

📌 Итог:

Если ты хочешь остановить скрипт вручную — просто нажми Ctrl+C. Если тебе нужно сделать это программно — используй clearInterval и process.exit().


Вот пример, как грамотно обработать завершение скрипта в Node.js, чтобы можно было безопасно завершать выполнение по разным причинам:

📌 Надёжное управление процессом в Node.js

// Имитация какого-то периодического процесса
const intervalId = setInterval(() => {
  console.log(`[${new Date().toLocaleTimeString()}] Работает...`);
}, 1000);

// Функция для безопасного завершения процесса
function gracefulShutdown() {
  console.log("\nЗавершение процесса...");

  // Останавливаем setInterval
  clearInterval(intervalId);

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

  // Делаем небольшую задержку перед завершением, если нужно
  setTimeout(() => {
    console.log("Процесс завершён.");
    process.exit(0); // Завершение процесса успешно
  }, 500);
}

// Обрабатываем разные сигналы и события завершения
process.on("SIGINT", gracefulShutdown); // Нажатие Ctrl+C
process.on("SIGTERM", gracefulShutdown); // Обычное завершение процесса (например, через kill PID)
process.on("uncaughtException", (err) => {
  console.error("Необработанное исключение:", err);
  gracefulShutdown();
});
process.on("unhandledRejection", (reason) => {
  console.error("Необработанное отклонение промиса:", reason);
  gracefulShutdown();
});

🔍 Что здесь происходит:

  1. Обработчики событий:
    • SIGINT — реагирует на Ctrl+C в терминале.
    • SIGTERM — реагирует на обычное завершение через kill PID.
    • uncaughtException — ловит необработанные исключения.
    • unhandledRejection — ловит необработанные промисы.
  2. gracefulShutdown():
    • Останавливает все таймеры (clearInterval()).
    • Можно добавить логику для очистки ресурсов.
    • Через process.exit(0) завершает процесс с успешным кодом выхода.