Остановка фонового скрипта
Если ты запустил скрипт через npm script
(например, npm run my-script
), и внутри него используется setInterval
, то он продолжает выполняться до тех пор, пока ты его явно не остановишь.
✅ Способы остановки:
- Нажать
Ctrl+C
в терминале.- Это стандартный способ прерывания процесса. Подходит, если ты запускаешь скрипт вручную и хочешь остановить его быстро.
- 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).
- Найти PID процесса:
- Если ты запустил скрипт в фоновом режиме (например, через
-
Использовать явную остановку через код.
В твоём скрипте можно предусмотреть условие остановки, например:
const intervalId = setInterval(() => { console.log("Работает..."); }, 1000); // Останавливаем через 5 секунд setTimeout(() => { clearInterval(intervalId); console.log("Скрипт остановлен."); process.exit(0); // Завершение процесса }, 5000);
Этот способ позволяет управлять завершением процесса программно.
-
Использовать сигналы (например,
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();
});
🔍 Что здесь происходит:
- Обработчики событий:
SIGINT
— реагирует наCtrl+C
в терминале.SIGTERM
— реагирует на обычное завершение черезkill PID
.uncaughtException
— ловит необработанные исключения.unhandledRejection
— ловит необработанные промисы.
gracefulShutdown()
:- Останавливает все таймеры (
clearInterval()
). - Можно добавить логику для очистки ресурсов.
- Через
process.exit(0)
завершает процесс с успешным кодом выхода.
- Останавливает все таймеры (