title: Running a node.js script every 10 seconds
body: <p>I just started using Node.js and I'm now trying to make my script run in the background every 10 seconds like a daemon waiting for something to do, when there is something to run from the database It reads the output from the program and does certain tasks depending on the output.</p>
  
  <p>This is what I've been able to do so far, It works just as I intended but can only run once even in the background. How can I make it run like a daemon every 10 seconds?</p>
  
  <p>Code:</p>
  
  <pre><code>var spawn = require('child_process').spawn;
  var mysql = require('mysql');
  var JSFtp = require('jsftp');
  var check = require('node-validator').check;
  var sanitize = require('node-validator').sanitize;
  
  //Setup the db connection
  var db = mysql.createConnection({
    host : 'db',
    port : 3306,
    database: 'db',
    user : 'db',
    password : 'db'
  });
  
  //Make the connection
  db.connect(function(err){
      if(err != null) {
          res.end('Error connecting to mysql:' + err+'\n');
      }
  });
  
  var die = function(msg){
      console.error(msg);
      process.exit(1);
  }
  
  function ip2long ( ip_address ) {
      var output = false;
      var parts = [];
      if (ip_address.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) {
          parts  = ip_address.split('.');
          output = ( parts[0] * 16777216 +
          ( parts[1] * 65536 ) +
          ( parts[2] * 256 ) +
          ( parts[3] * 1 ) );
      }
      return output;
  }
  
  
  db.query("SELECT * FROM queue WHERE cooldown &gt; UNIX_TIMESTAMP(NOW()) AND simulated=0 ORDER BY cooldown DESC LIMIT 1", function(err, rows){
      if(err != null){
          die("Query error: " + err);
      }
  
      if(rows &lt; 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 &amp;&amp; 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]) &lt; 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");
      });
  
  });//end sql
  </code></pre>