How make a node.js script to be restarted every hour?

3.6k views Asked by At

I have a node.js script that creates a websocket connection to a crypto trading site (bitmex). It streams price data.

For some reason after an hour or two the stream goes bad and the prices (if streamed at all) are inacurate.

For now I restart it manually every hour but I need that to be done automatically. How can I do that?

Here is the code of the script:

var WebSocket = require('ws');
var ws = new WebSocket("wss://www.bitmex.com/realtime");

var couchbase = require('couchbase')
var cluster = new couchbase.Cluster('couchbase://localhost/');
cluster.authenticate('xxxxxx', 'xxxxxxx');
var bucket = cluster.openBucket('test');
var N1qlQuery = couchbase.N1qlQuery;

let num_msg = 0;        
ws.onopen = function(){
    ws.send(JSON.stringify({"op": "subscribe", "args": [    
    "trade:XBTUSD",
    "trade:LTCZ18"]
    }))
};
ws.onmessage = function(msg){
    var response = JSON.parse(msg.data);
    num_msg++
    if(num_msg > 50) {
        var coin = response['data'][0]['symbol'];
        var price = response['data'][0]['price'];
        //console.log(coin + ":" + price + "\n");
        bucket.manager().createPrimaryIndex(
            function(){
                bucket.upsert(  coin, 
                                {
                                'price': price
                                },
                                function (err, result){
            });
        });

    }

};

EDIT: I missed to mention that currently I use Windows 7 system (eventhough I do need to move to Ubuntu or similar).

EDIT 2: Final version of my code :)

const cron = require("node-cron");
var WebSocket = require('ws');
var couchbase = require('couchbase');
var dateTime = require('node-datetime');

let now = new Date();
minutes = now.getMinutes() + 1;
if(minutes + 30 > 59) {
    minutes1 = minutes - 30;
} else {
    minutes1 = minutes - 30;
}
if(minutes > minutes1) {
    s_cron = minutes1 + "," + minutes +  " * * * *";
} else {
    s_cron = minutes + "," + minutes1 +  " * * * *";
}
cron.schedule(s_cron, () => {
    console.log("---------------------");
    console.log("Running Cron Job");
    var dt = dateTime.create();
    var formatted = dt.format('Y-m-d H:M:S');
    console.log(formatted);    
    // create bitmex ws
        var ws = new WebSocket("wss://www.bitmex.com/realtime");
        // connect to couchbase
        var cluster = new couchbase.Cluster('couchbase://localhost/');
        cluster.authenticate('xxxxxxxx', 'xxxxxxxxxx');
        var bucket = cluster.openBucket('test');
        var N1qlQuery = couchbase.N1qlQuery;

        let num_msg = 0;        
        ws.onopen = function(){
            ws.send(JSON.stringify({"op": "subscribe", "args": [    
                "trade:XBTUSD",
                "trade:LTCZ18"]
            }))
        };
        ws.onmessage = function(msg){
            var response = JSON.parse(msg.data);
            num_msg++
            if(num_msg > 50) {
                var coin = response['data'][0]['symbol'];
                var price = response['data'][0]['price'];
                //console.log(coin + ":" + price + "\n");
                bucket.manager().createPrimaryIndex(
                    function(){
                        bucket.upsert(  coin, 
                                        {
                                        'price': price
                                        },
                                        function (err, result){
                                            //bucket.disconnect()
                    });
                });

            }

        };
  });
2

There are 2 answers

4
Ramesh Navi On BEST ANSWER

Try 'node-cron': more at https://www.npmjs.com/package/node-cron Hope that works.

1
Trott On

Consider using cron to restart every hour. Your crontab entry would look like:

0 * * * * <command to restart your app>

If you can't or don't want to use your system crontab or equivalent (not sure what it would be on Windows), you can use pm2.

pm2: https://www.npmjs.com/package/pm2

For how to make pm2 restart every hour, see https://github.com/Unitech/pm2/issues/1076 or https://stackoverflow.com/a/38062307/436641.

Another option would be node-cron: https://www.npmjs.com/package/node-cron