Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start a Node.js app on system boot?

I'm working on a Raspberry Pi running Raspbian running a Node.js app and trying to get it to start when the Pi boots. I found a couple of examples but I can't seem to get it working. My current code is:

#! /bin/sh
# /etc/init.d/MyApp

### BEGIN INIT INFO
# Provides:          MyApp.js
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts MyApp.js
# Description:       Start / stop MyApp.js at boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting MyApp.js"
    # run application you want to start
    node /home/pi/app/MyApp/MyApp.js
   ;;
   stop)
    echo "Stopping MyApp.js"
    # kill application you want to stop
    killall MyApp.js
    ;;
  *)
    echo "Usage: /etc/init.d/MyApp {start|stop}"
    exit 1
    ;;
esac

exit 0

I have this in the etc/init.d folder, ran chmod +x /etc/init.d/MyApp, I'm able to run it manually, then I run sudo update-rc.d MyApp defaults, reboot and the script never runs. I've looked at some different examples, made adjustments and still no luck.

like image 947
user2650875 Avatar asked Feb 04 '14 03:02

user2650875


People also ask

How do I start a Node JS server?

During development you probably start your Node.js server by opening up the terminal and typing node index.js (or whatever file is the starting point of your application). If this command lives in the package.json file, you run it with NPM using npm start. When you press CTRL+C or close the terminal, the application exits as well.

Do I need to learn Node JS before deploying an application?

There's more to running a production Node.js appliction besides automatic restarts – you have to add useful logs and set up monitoring & alerting amongst other things. You don't have to learn those before deploying your application. Get your application live, show the world what you've built and worry about the rest later.

How do I run a node app from a batch file?

Just open it using %appdata% in run dailog box and locate to >Roaming>Microsoft>Windows>Start Menu>Programs>Startup The batch file will be executed at login time and start your node application from cmd. I would recommend installing your node.js app as a Windows service, and then set the service to run at startup.

How do I start a node app in the background?

To start an application in the background, you simply append & at the end of the command. Using the example from earlier, node index.js & will start your Node.js server in the background which will stay up even after you close the terminal or SSH connection to your production server. What happens when your application crashes?


3 Answers

I solved this problem by first checking where node.js was installed on RaspberryPi:

which node

This gave me :

/usr/local/bin/node

Open crontab config:

sudo crontab -e

Then in my crontab :

@reboot sudo /usr/local/bin/node <complete path to your .js app> &

Save, reboot, and problem solved !

like image 98
Mohit Athwani Avatar answered Oct 21 '22 09:10

Mohit Athwani


Mohit is right, but just for clarification, you can use readlink to find the full path for your Node.js app as it will be needed later to add as a cron job.

readlink -f <<name of file >>

For instance readlink -f HAP-NodeJS/Core.js results in /home/pi/HAP-NodeJS/Core.js

You can also use which node to find the full path where node.js is installed

Next, create a new cron job using sudo crontab -e and add the following code at the very end:

@reboot sudo /usr/local/bin/node <<.js application path>> &

for instance, my code looks like this.

@reboot sudo /usr/local/bin/node /home/pi/HAP-NodeJS/Core.js &

Upon reboot (or start up) , your Node.js should run. Hope this clears things.

like image 43
Adeel C Avatar answered Oct 21 '22 11:10

Adeel C


If you're using a prebuilt Pi release like 0.10.24, you may be experiencing a PATH issue.

You can either provide the full path to the node binary as part of the start command or make sure the PATH to the node binaries are set before /etc/init.d/MyApp is ran. I had the same issue and tried both with success. Also, the stop command as you have it may not be working.

#! /bin/sh
# /etc/init.d/test

### BEGIN INIT INFO
# Provides:          test
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting test.js"
    # run application you want to start
    #node /home/pi/test.js > /home/pi/test.log
    /home/pi/downloads/node-v0.10.24-linux-arm-pi/bin/node /home/pi/test.js >> /home/pi/test.log
   ;;
   stop)
    echo "Stopping test.js"
    # kill application you want to stop
    killall -9 node
    # Not a great approach for running
    # multiple node instances
    ;;
  *)
    echo "Usage: /etc/init.d/test {start|stop}"
    exit 1
    ;;
esac

exit 0

If you'd like to do sudo node, you can add the PATH to Defaults secure_path using sudo visudo.

Also, I would recommend using something like forever to keep your process running after crashes and what not.

like image 31
Kevin Reilly Avatar answered Oct 21 '22 10:10

Kevin Reilly