且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

每10秒运行一次node.js脚本

更新时间:2023-02-25 13:56:07

将您的数据库查询放入具有回调的函数中,并使回调在10秒后再次触发该函数:

Put your db query in a function with callback, and make the callback fire the function again 10sec later:

function mydbquery(callback) {
    db.query("SELECT * FROM queue WHERE cooldown > UNIX_TIMESTAMP(NOW()) AND simulated=0 ORDER BY cooldown DESC LIMIT 1", function(err, rows){
    if(err != null){
        die("Query error: " + err);
    }

    if(rows < 1){
        die("No rows");
    }

    //Set the vars from the query
    var name = rows[0]['name'];
    var ip = rows[0]['ip'];
    var iterations = rows[0]['runs'];

    var bin = "/home/hoar/sum/run"
    var args = ['arg='+name, 'arg2='+iterations, 'path=/var/www/upload/'+name+'.html', 'output=log.log'];
    var proc = spawn(bin, args);
    var time = "/.*/";
    var pct = "/^\d/";
    var name = rows[0]['name'];
    var ip = rows[0]['ip'];
    var iterations = rows[0]['runs'];

    proc.stdout.setEncoding('utf8');
    proc.stdout.on('data', function(data) {
        var str = data.toString();
        var s = str.split("|");
        var p = s[0].split("/");
        var t = (s[1] == null) ? "" : s[1];

        if(p != null && s[0] != "@"){ //Needed to check for @ because the program prints this as first line, which is good then we can do the query further done only once.
            //Check the return numbers from simc to see how many sims it has done
            if(parseInt(p[0]) < parseInt(p[1])){ 
                //Check if the 6th match is a number and the 7th only contains letters
                if(t != null){ 
                    var time = t.replace(/(\r\n|\n|\r)/gm,""); //Remove any line disturbers for db

                    //Update the database with the amount of time left on the simulation
                    db.query("UPDATE `queue` SET `status`=" + db.escape(time) + " WHERE (`name`=" + name + ")");
                    //console.log(p[0]+"/"+p[1] + " - " + t + " left");
                }
                //console.log(p[0]+"/"+p[1] + " iterations done");
            }
        }else{
            //If the stdout is null run this query since we don't want to run this more than once.
            db.query("UPDATE `queue` SET `simulated`='2' WHERE (`name`=" + name + " AND simulated!='2')");
            //console.log("Updated db to 2");
        }
    });

    proc.stderr.on('data', function (data) {
        var str = data.toString();
        //If the program returns stderr we want to make sure it stops and we update the database to let the user know.
        if(str.indexOf("ERROR! Setup failure...")){ 

            //Update the database with the amount of time left on the simulation
            db.query("UPDATE `queue` SET `simulated`='3' WHERE (`name`=" + name + ")");

            //Kill the DB connection
            db.destroy(); 
            die("There was an error: " + data);
        }
    });

    proc.on('exit', function (code) {
        //Setup the ftp connection
        var ftp = new JSFtp({
          host: "ftp",
          port: 21,
          user: "ftp",
          pass: "ftp"
        });

        //Simulation ended with success update the database and kill.
        db.query("UPDATE `queue` SET `simulated`='1' WHERE (`name`=" + name + " AND simulated='2')");

        ftp.put('/var/www/upload/'+rows[0]['name']+'.html', 'public_html/mysite/'+ip2long(rows[0]['ip'])+'/'+rows[0]['name']+'.html', function(hadError) {
          if (!hadError)
            console.log("FTP error");

            ftp.raw.quit();
        });
        db.destroy();

        //die("Simulation is done");
//NEW CODE!!! 
        callback();
//END OF NEW CODE
    });

});//end sql
}

//NEW CODE!!!
function wait10sec(){
    setTimeout(function(){
        mydbquery(wait10sec);
    }, 10000);
}

mydbquery(wait10sec);
//END OF NEW CODE

因此它将执行您的查询,然后等待10秒再触发另一个.

So it will do your query, then wait 10sec before firing another.