#Linux - Running a Node Service (Forever) This is based on the excellent post at http://www.exratione.com/2013/02/nodejs-and-forever-as-a-service-simple-upstart-and-init-scripts-for-ubuntu/. Forever is a useful tool for running a Node.js process with monitoring; it can be set to restart a failed process, and has a few other helpful features along the same lines. In this post you'll find a couple of exceedingly simple scripts for running a Node.js process as a service on Ubuntu using Forever. ##Install Forever <a href="https://github.com/nodejitsu/forever">Forever</a> must be installed globally. npm -g install forever ##Upstart <a href="http://upstart.ubuntu.com/">Upstart</a> is an alternative to using standard issue init scripts and is installed by default on Ubuntu. A script resides in the /etc/init folder and has a .conf file extension, e.g. /etc/init/my-application.conf. Run or check on the script and its process with the following commands: ``` start my-application status my-application restart my-application stop my-application ``` ###Upstart Script Most upstart scripts are set to automatically start and stop for specific run levels in the same way as init scripts. Here is an example Upstart script for a Node.js service running under Forever: ``` #!upstart # # An example upstart script for running a Node.js process as a service # using Forever as the process monitor. For more configuration options # associated with Forever, see: https://github.com/nodejitsu/forever # # You will need to set the environment variables noted below to conform to # your use case, and should change the description. # description "Example upstart script for a Node.js process" start on startup stop on shutdown # This line is needed so that Upstart reports the pid of the Node.js process # started by Forever rather than Forever's pid. expect fork # The following environment variables must be set so as to define # where Node.js and Forever binaries and the Node.js source code # can be found. # # The example environment variables below assume that Node.js is # installed into /home/node/local/node by building from source as outlined # here: # http://www.exratione.com/2011/07/running-a-nodejs-server-as-a-service-using-forever/ # # It should be easy enough to adapt to the paths to be appropriate to a # # It should be easy enough to adapt to the paths to be appropriate to a # package installation, but note that the packages available for Ubuntu in # the default repositories are far behind the times. Most users will be # building from source to get a more recent Node.js version. # # The full path to the directory containing the node and forever binaries. # env NODE_BIN_DIR="/home/node/local/node/bin" # Set the NODE_PATH to the Node.js main node_modules directory. # env NODE_PATH="/home/node/local/node/lib/node_modules" # The directory containing the application Javascript file. # env APPLICATION_DIRECTORY="/home/node/my-application" # The application start Javascript filename. # env APPLICATION_START="start-my-application.js" # Log file path. # env LOG="/var/log/my-application.log" env NODE_BIN_DIR="/usr/local/bin" env NODE_PATH="/usr/local/lib/node_modules" env APPLICATION_DIRECTORY="/var/www/api.nodenx.com" env APPLICATION_START="server.js" env LOG="/var/log/nodlog.log" env NODE_ENV="production" script # Add the node executables to the path, which includes Forever if it is # installed globally, which it should be. PATH=$NODE_BIN_DIR:$PATH # installed globally, which it should be. PATH=$NODE_BIN_DIR:$PATH # The minUptime and spinSleepTime settings stop Forever from thrashing if # the application fails immediately on launch. This is generally necessary to # avoid loading development servers to the point of failure every time # someone makes an error in application initialization code, or bringing down # production servers the same way if a database or other critical service # suddenly becomes inaccessible. exec forever --sourceDir $APPLICATION_DIRECTORY -a -l $LOG \ --minUptime 5000 --spinSleepTime 2000 start $APPLICATION_START end script pre-stop script # Add the node executables to the path. PATH=$NODE_BIN_DIR:$PATH # Here we're using the pre-stop script to stop the Node.js application # process so that Forever is given a chance to do its thing and tidy up # its data. Note that doing it this way means that each application that # runs under Forever must have a different start file name, regardless of # which directory it is in. exec forever stop $APPLICATION_START >> $LOG end script ``` You then need to register the service using: update-rc.d nodlog defaults This will use the default settings which is to start in runlevels 2-5 and stop in runlevels 0,1 and 6. You can specify exactly which runlevels you want if you wish. ##Run the Service at Startup You can run the service at startup by adding it to the ```/etc/rc.local``` file (/etc/rc.d/rc.local in Red Hat/CentOS). ``` #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. service nodlog start exit 0 ```