Остановка фонового скрипта
Если ты запустил скрипт через 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)завершает процесс с успешным кодом выхода.
- Останавливает все таймеры (