Node-cron: автоматизация задач в Node.js с помощью cron-заданий

    Команда Simple-Server
    03.06.2026
    12 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Что такое cron и node-cron

    Cron — это планировщик задач в Unix-подобных операционных системах (например, Linux), который позволяет автоматически запускать команды или скрипты по расписанию. Расписание указывается в формате crontab, где каждая строка описывает время выполнения задачи и команду, которую нужно запустить.

    node-cron — это библиотека для Node.js, которая реализует функциональность Cron внутри JavaScript-приложений. Она позволяет создавать задачи, которые будут выполняться по заданному расписанию, ориентируясь на реальное время в выбранном часовом поясе, аналогично Cron в Unix-системах

    Основные преимущества node-cron:

    • Простота интеграции в существующие Node.js-проекты.
    • Возможность динамического управления задачами.
    • Поддержка тех же форматов расписания, что и в классическом Cron.

    node-cron имеет синтаксис, аналогичный обычному Cron:

    Допустимые значения для полей:

    ПолеЗначение
    Секунды0-59
    Минуты0-59
    Часы0-23
    День месяца1-31
    Месяц1-12 (или названия на английском языке)
    День недели0-7 (или названия на английском языке, 0 или 7 — воскресенье)

    1-12 (или названия на английском языке)

    0-7 (или названия на английском языке, 0 или 7 — воскресенье)

    const cron = require('node-cron'); cron.schedule('1,2,4,5 * * * *', () => { console.log('выполняется каждую 1, 2, 4 и 5 минуту'); }); const cron = require('node-cron'); cron.schedule('1-5 * * * *', () => { console.log('выполняется каждую 1-5 минуту'); });

    Значения шагов можно использовать в сочетании с диапазонами, указав после диапазона символ / и число. Например: 1-10/2 — это то же самое, что 2, 4, 6, 8, 10. Шаги могут использоваться после звездочки, поэтому, если вы хотите запускать каждые две минуты, просто используйте */2.

    const cron = require('node-cron'); cron.schedule('*/2 * * * *', () => { console.log('выполняется каждые 2 минуты'); });

    Для обозначения месяца и дня недели можно использовать их полные названия:

    const cron = require('node-cron'); cron.schedule('* * * January,September Sunday', () => { console.log('выполняется по воскресеньям января и сентября'); }); const cron = require('node-cron'); cron.schedule('* * * Jan,Sep Sun', () => { console.log(''выполняется по воскресеньям января и сентября'); });

    В node-cron используется основной метод, который планирует выполнение задачи, — Schedule. Как аргументы он принимает выражение cron, функцию-задачу и дополнительную конфигурацию:

    • scheduled — состояние задачи, запущена она или нет. Тип данных — Boolean.
    • timezone — часовой пояс, время которого будет использовать cron. Тип данных — String.
    const cron = require('node-cron'); cron.schedule('0 1 * * *', () => { console.log('Выполнится в 01:00 по Московскому времени'); }, { scheduled: true, timezone: "Europe/Moscow" });

    Для управления статусами задач используются два метода:

    • Start — служит для запуска остановленной задачи.
    • Stop — служит для остановки запущенной задачи.
    const cron = require('node-cron'); const task = cron.schedule('* * * * *', () => { console.log('Остановленная задача'); }, { scheduled: false }); task.start(); const cron = require('node-cron'); const task = cron.schedule('* * * * *', () => { console.log(Будет выполняться каждую минуту, пока не остановится); }); task.stop();

    Подготовка рабочего пространства

    Подготовим наше пространство для работы с Node.js и node-cron.

    Чтобы запустить локальную разработку, нужно установить актуальную версию Node.js (рекомендуем v22.14.0 LTS). Вместе с Node.js установится npm — стандартный менеджер пакетов JavaScript.

    1. Перейдите на официальный сайт nodejs.org и скачайте установщик.
    2. Запустите его и следуйте инструкциям.
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash \. "$HOME/.nvm/nvm.sh" nvm install 22
    1. После установки введите в командной строке:

    Убедитесь, что версии Node.js и npm корректно отображаются.

    1. Создайте новый каталог для проекта и перейдите в него:

    Создайте новый каталог для проекта и перейдите в него:

    mkdir node-cron-project && cd node-cron-project npm install --save node-cron

    Базовый пример использования node-cron

    Рассмотрим простой, но интересный проект на основе библиотеки node-cron.

    Задача: автоматически получать курс доллара США к рублю и сохранять эти данные в файл.

    Проект простой, но он отлично демонстрирует основные возможности node-cron и показывает, как использовать библиотеку для регулярных задач.

    Установка дополнительных библиотек

    Установим дополнительные зависимости для проекта:

    • axios — для выполнения HTTP-запросов, будем использовать для работы с API.
    • fs — для работы с файловой системой, будем использовать для записи данных в файл.

    Задачи нашего приложения будут следующими:

    1. Создаем задачу, чтобы получать каждую минуту актуальный курс.
    2. Записываем данные в файл exchange_rates.txt.
    3. Пишем лог в консоль.

    Создадим файл index.js, в котором мы будем писать весь наш код.

    const cron = require('node-cron'); const axios = require('axios'); const fs = require('fs'); if (!fs.existsSync('exchange_rates.txt')) { fs.writeFileSync('exchange_rates.txt', ''); } async function getExchangeRate() { try { const response = await axios.get('https://open.er-api.com/v6/latest/USD'); const rate = response.data.rates.RUB; return rate; } catch (error) { console.error('Ошибка при получении курса:', error); return null; } } function saveData(rate) { const currentTime = new Date().toLocaleString(); const data = { time: currentTime, rate }; fs.appendFileSync('exchange_rates.txt', `${JSON.stringify(data)}\n`); console.log(`Курс сохранён: ${currentTime} - ${rate} RUB`); } cron.schedule('* * * * *', async () => { const rate = await getExchangeRate(); if (rate !== null) { saveData(rate); } }); console.log('Сбор данных запущен...');

    Рассмотрим код подробнее:

    1. Вначале при помощи if (!fs.existsSync('exchange_rates.txt')) проверяем наличие файла exchange_rates.txt. Если его нет — создаем.
    2. Функция getExchangeRate: Получает курс доллара к рублю через публичный API. В данном примере используется API от open.er-api.com.
    3. Функция saveData: Сохраняет полученные данные (курс и текущее время) в файл exchange_rates.txt. Данные добавляются в конец файла, чтобы можно было отслеживать историю изменений.
    4. Основной цикл сбора данных: Настроено задание cron.schedule('* * * * *'), которое выполняется каждую минуту. В это время вызывается функция getExchangeRate, а результат сохраняется в файл.

    Тестирование написанного проекта

    Для запуска нашего проекта воспользуемся командой:

    После запуска получаем вывод в консоль:

    Спустя некоторое время получаем логи в консоль:

    И в созданном файле exchange_rates.txt появилась информация о дате, времени и курсе:

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

    Использование node-cron в реальном проекте

    Применим node-cron в прикладной задаче. Напишем скрипт, который автоматически отправляет письма. Данный кейс часто применяется компаниями для отправки различной рекламной информации. Это решение простое в реализации, но функциональное.

    Получение пароля приложения

    Для начала нам необходимо получить токен для своей почты Gmail:

    1. Перейдите в свой аккаунт Google.

    2. Перейдите в раздел «Безопасность».

    3. Выберите двухэтапную аутентификацию. Здесь вам нужно подтвердить свою личность, например, через код подтверждения, отправленный по смс. После этого вы сможете включить двухэтапную аутентификацию.

    4. Перейдите к «Паролям приложений», чтобы создать свое приложение.

    5. Присвойте имя, например, nodemailer своему приложению и создайте его.

    6. Появится модальное окно с паролем. Скопируйте этот пароль и используйте его в коде.

    Для начала установим необходимые библиотеки. node-cron уже установлен, поэтому нам необходимо установить только nodemailer.

    Теперь создайте файл app.js и напишите туда следующий код:

    const nodemailer = require('nodemailer'); const cron = require('node-cron'); const recipients = [ 'recipient1@gmail.com', 'recipient2@mail.ru' ]; let transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'sender@example.com', pass: 'PASSWORD' } }); function sendEmail(recipient) { let mailOptions = { to: recipient, subject: 'Запланированное письмо', text: 'Письмо отправленное автоматически по заданному расписанию node-cron', html: '<b>Письмо отправленное автоматически по заданному расписанию node-cron</b>' }; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(`Ошибка отправки письма на email ${recipient}:`, error); } else { console.log(`Письмо успешно отправлено на email ${recipient}:`, info.response); } }); } cron.schedule('* * * * *', () => { console.log('Запуск cron-tab'); recipients.forEach((recipient) => { sendEmail(recipient); }); });
    • Массив recipients с получателями нашего письма.
    • Переменная let transporter хранит в себе информацию об аутентификации отправителя. В переменную user вам необходимо написать свою gmail-почту, а в pass — полученный ранее код.
    • Функция sendEmail принимает в себя получателя письма, переменная let mailOptions хранит информацию о нашем письме: получателя, тему и текст (в примере указаны два варианта: просто текст и текст в HTML-формате). Функция transporter.sendMail отправляет письмо.
    • Функция cron.schedule('* * * * *') создает задачу отправлять письмо каждую минуту.

    Для запуска файла пишем команду:

    И спустя пару минут получаем вывод в консоль:

    Проверив почту, получаем наши письма:

    Деплой проекта на облачный сервер Simple-Server

    После всех этапов создания нам необходимо выгрузить наше приложение в облако.

    Для нашего небольшого приложения с автоматической отправкой писем подойдет конфигурация CPU 1 x 3.3ГГц, RAM 1 ГБ, NVMe 15 ГБ, 1 IPv4 стоимостью 300 ₽ в месяц.

    1. После создания сервера нам необходимо установить среду Node.js на сервер. Для этого используем команды:
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash \. "$HOME/.nvm/nvm.sh" nvm install 22
    1. Проверяем версии при помощи:

    Если всё установлено корректно, мы получим следующий вывод:

    1. Далее необходимо создать каталог, это можно сделать при помощи команды:
    cd /home && mkdir nodemailer
    1. Перенесите в каталог файлы app.js и package.json.

    На Windows для этого можно использовать FileZilla. На Linux/MacOS воспользуйтесь командой:

    rsync -av --exclude="node_modules" ./ root@109.73.207.170:/home/nodemailer
    • * `--exclude="node_modules"` — не включаем директорию с установленными библиотеками.
    * `./` — путь, откуда копируем * `root@109.73.207.170:/home/nodemailer` — путь, куда копируем. Обратите внимание на формат: `username@server_ip:/path`.
    • --exclude="node_modules" — не включаем директорию с установленными библиотеками.
    • ./ — путь, откуда копируем
    • root@109.73.207.170:/home/nodemailer — путь, куда копируем. Обратите внимание на формат: username@server_ip:/path.
    1. После того как мы перенесли файлы, перейдем в директорию и проверим, что они там действительно есть:
    cd /home/nodemailer && ls

    Если всё правильно, мы получим вывод:

    1. Далее нам необходимо установить все библиотеки. Вводим команду:

    2. Проверяем, что всё корректно работает. Запускаем скрипт командой:

    3. Проверяем, что сообщения успешно отправляются. Если возникает проблема с отправкой письма, проверьте, что у вас не закрыт порт 465 на сервере. В случае проблем напишите в поддержку, специалисты проверят и откроют порт. Если всё корректно, переходим к следующему шагу.

    4. Создайте юнит-файл /etc/systemd/system/nodemailer.service:

    sudo nano /etc/systemd/system/nodemailer.service

    Добавьте в файл следующее содержимое:

    [Unit] Description=NodeMailer Service After=network.target [Service] User=root WorkingDirectory=/home/nodemailer ExecStart=/root/.nvm/versions/node/v22.14.0/bin/node /home/nodemailer/app.js Restart=always RestartSec=5 [Install] WantedBy=multi-user.target

    Данный файл необходим для удобного управления и постоянной работы нашего приложения, даже после закрытия терминала. Обратите внимание, в ExecStart необходимо указать абсолютный путь до установленной node и абсолютный путь до файла который мы будем запускать.

    При необходимости измените значения следующих переменных:

    • WorkingDirectory — директория проекта
    • ExecStart — команда для запуска приложения
    1. Перезапустите systemd и включите службу:
    sudo systemctl daemon-reload sudo systemctl enable nodemailer.service sudo systemctl start nodemailer.service
    1. Проверьте статус службы и при необходимости просмотрите логи:
    sudo systemctl status nodemailer.service

    При нормальном запуске в поле «Active» находится значение «active (running)».

    sudo journalctl -u nodemailer.service -f

    При необходимости управлять службами можно командами:

    sudo systemctl restart nodemailer.service sudo systemctl stop nodemailer.service
    • Удаление службы (если необходимо)

    Удаление службы (если необходимо)

    sudo systemctl disable nodemailer.service sudo rm /etc/systemd/system/nodemailer.service sudo systemctl daemon-reload

    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны