2 min read

Home Server autoStandby.js

If you want to wake up a server in your LAN you use Wake-on-lan, but what do you do if you want to automatically switch it off?
 
 
My situation is that I've a server which is also used as desktop to browse some internet pages, so some normal techniques doesn't apply:
  • desktop: GNOME/Unity/Ubuntu have built-in suspend after X minutes of inactivity (user level)
  • server: You can check if your cpu load is low and then pm-suspend it

Problems

  • If I'm downloading a file remotely via ssh + screen the desktop user is inactive so the computer is suspended by desktop suspend.
  • If I'm reading a page as desktop user the cpu load is low so the computer is suspended by the server script.
What to do?
 
Here is my solution: autoStandby.js . You need to disable desktop user level suspend and install 'xprintidle' utility (apt-get has it).
 
// autoStandby.js
var os = require('os');

// tick cicle
setInterval(function(){

// check low workload
var cpuload = os.loadavg()[2];
console.log(new Date()+ ' cpuload: ' +cpuload);
if (cpuload < 0.22) { // set your idle load, mine is 0.22

// check idle user
var exec = require('child_process').exec,
child;
child = exec('sudo -u your-desktop-user env DISPLAY=:0.0 xprintidle',
  function (error, stdout, stderr) {

    // do stanby
    console.log('xstdoutms: ' + stdout);
    var xidleMs = stdout;
    if (xidleMs &gt; 60 * 1000) {
      console.log('Goodbye crul world!!!');
      var exec = require('child_process').exec,
      child;
      child = exec('pm-suspend',
        function (error, stdout, stderr) {
          console.log('stdout: ' + stdout);
          console.log('stderr: ' + stderr);
          if (error !== null) {
            console.log('exec error: ' + error);
          }
      });
    }
    console.log('xstderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

}

}, 3 * 60 * 1000); // check every 3mins

 
Then you can run it with "node autoStanby.js" via screen, upstart or systemd.

Limitations

  • It runs as root
  • If the computer is used by more than one desktop user, the script must be tweaked
  • I know probably a bash version would be simpler, but I think to extend it in future with a web ui
 
What do you think? You have a better solution? Let me know it!