DEV Community

Cover image for Create a simple Express.js server to shutdown your PC remotely.
Marwan B.
Marwan B.

Posted on

Create a simple Express.js server to shutdown your PC remotely.

The inspiration

I am a very lazy person. I sometimes go to take a nap & because I'm already in bed, I do not want to stand up & go shutdown my PC myself.

So that's why I thought to myself I might create some small script that listens to a certain port & runs as a daemon/service in the background. That should save me standing up from my bed.

Choosing how to implement the idea

At first I thought I should make some sockets, given the simplicity of the task, but because this is too low-level for me & as I mentioned before I am too lazy to do everything by hand, I eventually chose Express.JS. Given that it is easy to setup a simple HTTP server very quickly & easily.

Actual implementation

For the actual implementation.

  • I started out by creating a Node.js program with:
npm init
Enter fullscreen mode Exit fullscreen mode
  • Then I installed my dependencies:
npm i express
Enter fullscreen mode Exit fullscreen mode
  • The programming began with setting up a GET method that fires a windows command. To fire command line commands within Node.js use the child_process module.

We implement the auxiliary shutdown function, that executes the shutdown signal, here I added the time flag -t & gave it 30 seconds so the shutdown takes 30 seconds. Feel free to add whatever options you want, maybe even a restart.

Useful tip use shutdown -a to cancel the programmed shutdown or restart.

const exec = require('child_process').exec;
// Create shutdown function
function shutdown(callback) {
  exec('shutdown -s -t 0030', 
      function (error, stdout, stderr) { callback(stdout); });
Enter fullscreen mode Exit fullscreen mode

Here is the first GET method:

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'public/home.html'))
Enter fullscreen mode Exit fullscreen mode

As you can see I decided to serve an HTML page statically.
This page has a stylized shut-down button. When clicked, the button fires the actual shutdown command and another GET request that shows a countdown till shutdown.

app.get('/shutdown', (req, res) => {
  res.sendFile(path.join(__dirname, 'public/shutting-down.html'))
  // shutdown computer
  shutdown(function (output) {
    console.log('received shutdown command');
Enter fullscreen mode Exit fullscreen mode


Serving the static files

Now that the functionality is implemented, you can opt to using a template engine like Pug, but I stuck with simple way of serving static files.
For that you need to use the static middleware from Express.js.
I created a public directory where the static files will be & used the middleware to point to it.

Enter fullscreen mode Exit fullscreen mode


I used following snippets for my button styling and the counter. I also used font-awesome's CDN, to get the power-off icon.

CSS Counter
Really well written code you only need to change the duration to your liking and embed it in your served HTML.

CSS Pulse power-off
You just need to change the color and add the desired icon from font-awesome.

Creating the service

Under Linux this is no issue using systemctl.
With Windows it is kinda tricky you need to first download and install nssm. For brevity I won't explain how to install it. But it should be very simple. And it'll help you a lot.
Now that we have nssm installed we now need to convert our index.js to an index.exe. To do that we need to install the pkg dependency globally.

npm i -g pkg
Enter fullscreen mode Exit fullscreen mode

After that we execute following command as an admin:

pkg index.js -t  node10-win-x64
Enter fullscreen mode Exit fullscreen mode

Now we run the following command in cmd:

nssm install
Enter fullscreen mode Exit fullscreen mode

Prompting following window, we click on the locate button and choose our executable


Then we name our service I'll name mine shutdown-server and press Install service.


Opening the task manager and checking the service tab for our service.


Final project structure


Discussion (0)