Skip to content

Instantly share code, notes, and snippets.

@stolsma
Last active August 29, 2015 14:00
Show Gist options
  • Select an option

  • Save stolsma/11212534 to your computer and use it in GitHub Desktop.

Select an option

Save stolsma/11212534 to your computer and use it in GitHub Desktop.

Revisions

  1. stolsma revised this gist Apr 23, 2014. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions node init script.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,7 @@
    Init Script
    ===========

    From: [source](https://www.exratione.com/2013/02/nodejs-and-forever-as-a-service-simple-upstart-and-init-scripts-for-ubuntu/)

    Init scripts hopefully need no explanation. Scripts reside in /etc/init.d with root ownership and executable permissions. e.g.:

  2. stolsma created this gist Apr 23, 2014.
    185 changes: 185 additions & 0 deletions node init script.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,185 @@
    Init Script

    Init scripts hopefully need no explanation. Scripts reside in /etc/init.d with root ownership and executable permissions. e.g.:

    ``` bash
    sudo su
    cp my-application-script /etc/init.d/my-application
    chmod a+x /etc/init.d/my-application
    ```

    After putting the script in place, you should update the system service definitions:

    ``` bash
    update-rc.d my-application defaults
    ```

    Run or check on the script and its process with the following commands:

    ``` bash
    service my-application start
    service my-application status
    service my-application restart
    service my-application stop
    ```

    Here is an example init script for a Node.js service running under Forever:

    ``` bash
    #!/bin/bash
    #
    # An example init 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 change the init info comment block.
    #
    # This was written for Debian distributions such as Ubuntu, but should still
    # work on RedHat, Fedora, or other RPM-based distributions, since none
    # of the built-in service functions are used. If you do adapt it to a RPM-based
    # system, you'll need to replace the init info comment block with a chkconfig
    # comment block.
    #
    ### BEGIN INIT INFO
    # Provides: my-application
    # Required-Start: $syslog $remote_fs
    # Required-Stop: $syslog $remote_fs
    # Should-Start: $local_fs
    # Should-Stop: $local_fs
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: My Application
    # Description: My Application
    ### END INIT INFO
    #
    # Based on:
    # https://gist.github.com/3748766
    # https://github.com/hectorcorrea/hectorcorrea.com/blob/master/etc/forever-initd-hectorcorrea.sh
    # https://www.exratione.com/2011/07/running-a-nodejs-server-as-a-service-using-forever/

    # Source function library. Note that this isn't used here, but remains to be
    # uncommented by those who want to edit this script to add more functionality.
    # Note that this is Ubuntu-specific. The scripts and script location are different on
    # RPM-based distributions.
    # . /lib/lsb/init-functions

    # The example environment variables below assume that Node.js is
    # installed into /home/node/local/node by building from source as outlined
    # here:
    # https://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
    # 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.
    #
    # An application name to display in echo text.
    # NAME="My Application"
    # The full path to the directory containing the node and forever binaries.
    # NODE_BIN_DIR=/home/node/local/node/bin
    # Set the NODE_PATH to the Node.js main node_modules directory.
    # NODE_PATH=/home/node/local/node/lib/node_modules
    # The directory containing the application start Javascript file.
    # APPLICATION_DIRECTORY=/home/node/my-application
    # The application start Javascript filename.
    # APPLICATION_START=start-my-application.js
    # Process ID file path.
    # PIDFILE=/var/run/my-application.pid
    # Log file path.
    # LOGFILE=/var/log/my-application.log
    #
    NAME=
    NODE_BIN_DIR=
    NODE_PATH=
    APPLICATION_DIRECTORY=
    APPLICATION_START=
    PIDFILE=
    LOGFILE=

    # Add node to the path for situations in which the environment is passed.
    PATH=$NODE_BIN_DIR:$PATH
    # Export all environment variables that must be visible for the Node.js
    # application process forked by Forever. It will not see any of the other
    # variables defined in this script.
    export NODE_PATH=$NODE_PATH

    start() {
    echo "Starting $NAME"
    # We're calling forever directly without using start-stop-daemon for the
    # sake of simplicity when it comes to environment, and because this way
    # the script will work whether it is executed directly or via the service
    # utility.
    #
    # 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.
    #
    # The pidfile contains the child process pid, not the forever process pid.
    # We're only using it as a marker for whether or not the process is
    # running.
    forever --pidFile $PIDFILE --sourceDir $APPLICATION_DIRECTORY \
    -a -l $LOGFILE --minUptime 5000 --spinSleepTime 2000 \
    start $APPLICATION_START &
    RETVAL=$?
    }

    stop() {
    if [ -f $PIDFILE ]; then
    echo "Shutting down $NAME"
    # Tell Forever to stop the process. Note that doing it this way means
    # that each application that runs as a service must have a different
    # start file name, regardless of which directory it is in.
    forever stop $APPLICATION_START
    # Get rid of the pidfile, since Forever won't do that.
    rm -f $PIDFILE
    RETVAL=$?
    else
    echo "$NAME is not running."
    RETVAL=0
    fi
    }

    restart() {
    echo "Restarting $NAME"
    stop
    start
    }

    status() {
    echo "Status for $NAME:"
    # This is taking the lazy way out on status, as it will return a list of
    # all running Forever processes. You get to figure out what you want to
    # know from that information.
    #
    # On Ubuntu, this isn't even necessary. To find out whether the service is
    # running, use "service my-application status" which bypasses this script
    # entirely provided you used the service utility to start the process.
    forever list
    RETVAL=$?
    }

    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    status)
    status
    ;;
    restart)
    restart
    ;;
    *)
    echo "Usage: {start|stop|status|restart}"
    exit 1
    ;;
    esac
    exit $RETVAL

    ```