Как запланировать node.js файл, который запускается в терминале?

#node.js

Вопрос:

Я запускаю файл node js с помощью своего терминала mac. (Запустив командный узел myscript.js на моем терминале).

Сценарий выглядит так, и он предназначен для вызова API.

 const api = require('fxme');

const fxmeRest = new api.fxmeRest({
    key: '123',
    secret: '123', 
    timeout: 15000, 
    recvWindow: 10000, 
    disableBeautification: false,
   
    handleDrift: true
   
});

var schedule = require('node-schedule');

var j = schedule.scheduleJob('*/30 * * * * ', function(){
  console.log('The answer to life, the universe, and everything!');
});

    fxmeRest.newOrder({
        symbol: 'AUDUSD',
        side: 'BUY',
        price: '1',
    })
    .then((data) => {
        console.log(data);
    })
    .catch((err) => {
        console.error(err);
    }); 

Он работает нормально, когда я просто печатаю node myscript.js на своем терминале.

Но потом я захотел запустить его в определенное время. Например, я хочу, чтобы функции вызывались ровно в 01.22 вечера в определенную дату.

Для достижения этой цели я использовал node-расписание. Поэтому я вставил его в начало своего сценария вот так

 var schedule = require('node-schedule');
 

и внес следующее изменение в мой код.

     var date = new Date(2022, 03, 23, 01, 22, 0);

var j = schedule.scheduleJob(date, function(){

    fxmeRest.newOrder({
        symbol: 'AUDUSD',
        side: 'BUY',
        price: '1',
    })
    .then((data) => {
        console.log(data);
    })
    .catch((err) => {
        console.error(err);
    });

});
 

И запустил его, как и раньше, с помощью моего терминала. Но проблема в том, что скрипт вообще не запускается. (Даже не в указанное время. Что я здесь делаю не так? Любая помощь, которую вы можете оказать, будет весьма признательна.

Ответ №1:

Тебе это не нужно node-schedule . Я полагаю, что для работы со сценарием его необходимо запускать и запускать непрерывно node-schedule .

В системах, подобных Un*x (macOS, все линейки и т.д.), Вы можете использовать демон cron, предоставляемый системой.

Запустите man -s 5 crontab в своем терминале, чтобы узнать, как описать задание в crontab файле.

Запустите crontab -e , чтобы отредактировать свой личный кронтаб. Это текстовый файл (изначально пустой), в котором вы можете описать, какие команды запускать и когда. На странице руководства приведено несколько примеров, которые могут вам помочь.

Чтобы запускать свой скрипт каждые 30 минут, вам нужно добавить в файл следующую строку:

 */30 * * * *  node myscript.js
 

Поскольку демон cron работает от имени root, возможно, он не сможет найти node его на своем пути. Вы можете либо использовать полный путь к node в приведенной выше команде, либо установить переменную PATH среды поверх файла crontab.

Используйте type -p node для поиска пути к node исполняемому файлу.

Вы также должны задать переменную MAILTO среды на вкладке crontab перед любым расписанием, чтобы указать адрес электронной почты. Все, что создает ваш скрипт в stdout и stderr (включая любые сообщения об ошибках), записывается демоном cron и отправляется по электронной почте на адрес электронной почты, указанный в MAILTO переменной. Он не отправляет никакого электронного письма, если скрипт не выдает никаких выходных данных.


Если вас не интересуют выходные данные вашего скрипта и вы не хотите получать электронные письма от демона cron (возможно, потому, что скрипт создает некоторые файлы, присутствие и/или содержимое которых можно использовать для получения информации о его результатах), вы можете перенаправлять stdout /dev/null и дублировать stdout stderr . Добавьте 1>/dev/null 2>amp;1 в командную строку. Или просто добавьте amp;>/dev/null , это имеет тот же эффект. Введите man bash свой терминал и прочитайте о перенаправлениях, чтобы узнать больше об этом.