4

Basically what i want to accomplish, is some sort of script or method for me to start a node.js socket server script, as a service.

This is to make it so that i don't have to physically run 'node server.js' in SSH and have to sit there with it open.

Any help would be appreciated.

Thanks Scott

3
  • do you mean init.d script? Have you tried supervisord? If you don't need a real service you could use screen, tmux Commented Aug 21, 2012 at 18:15
  • voting down as "not showing any research effort" since a simple Google search on the title of the post shows multiple results and similar questions on stackoverflow.com Commented Aug 21, 2012 at 19:36
  • 1
    I know this is an old question, but just check my solution :) I also was wondering to do something similar to your question, so i did it. Commented Dec 3, 2012 at 9:44

3 Answers 3

4

I don't see anything criminal in wanting to use something different except forever. In my project i also avoid using this kind of tools and more rely on system capabilities. Since i also try to avoid running my application as root, i cannot use SystemV nor Upstart.

And here comes mighty shell scripting! I have created few bash scripts that are doing simply tasks, such as process watchdog with ability to start, stop, restart and query status.

Check this code. Feel free to modify it as you will. To use it -- put your command there in COMMAND parameter. And execute ./path_to_script.sh -start. This will create watchdog process, which will start your node process and watch if it dies or not and if yes, it will restart it. It is far not ideal, so if anyone has something to fix, add, remove here, feel free to comment below.

#!/bin/bash

CURRENT_PATH=$(pwd)

LOGFOLDER=$CURRENT_PATH"/logs/"
PIDFOLDER=$CURRENT_PATH"/pid/"

#PID file where the this script process ID is stored
WATCHDOGPIDFILE=$PIDFOLDER"watchdog-admin.pid"
#PID file where the node process ID is stored
NODEPIDFILE=$PIDFOLDER"node-admin.pid"
#Watchdog process error log file
WATCHDOGLOGFILE=$LOGFOLDER"admin-watchdog-error.log"
#Node process error log file
NODELOGFILE=$LOGFOLDER"admin-error.log"
#Command to be executed on daemon start
COMMAND="node ./admin/app.js 1> /dev/null 2>> $NODELOGFILE"

ARG_1=$1

start() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            return;
        else
            touch $NODEPIDFILE
            nohup $COMMAND &
            echo $! > $NODEPIDFILE
        fi
    else
        touch $NODEPIDFILE
        nohup $COMMAND &
        echo $! > $NODEPIDFILE
    fi
}

stop() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            kill -9 $PID
        fi
        rm $NODEPIDFILE
    fi
}

stopdaemon() {
    stop
    rm $WATCHDOGPIDFILE
    exit 0
}

log() {
    echo $1 >> $WATCHDOGLOGFILE
}

keep_alive() {
    if [ -e $NODEPIDFILE ]; then
        PID=$(cat $NODEPIDFILE)
        if [ $(ps -o pid | grep $PID) ]; then
            return;
        else
            log "Jim, he is dead!! Trying ressurection spell..."
            start
        fi
    else
        start
    fi
}

case x${ARG_1} in
    x-start )

        echo "Starting daemon watchdog"
        nohup "$0" -daemon &> /dev/null &

    ;;

    x-daemon )

        if [ -e $WATCHDOGPIDFILE ]; then
            PID=$(cat $WATCHDOGPIDFILE)
            if [ $(ps -o pid | grep $PID) ]; then
                exit 0;
            fi
        fi

        touch $WATCHDOGPIDFILE

        echo $$ > $WATCHDOGPIDFILE

        #trap the interruption or kill signal
        trap stopdaemon INT SIGINT TERM SIGTERM

        start

        while true; do
            keep_alive
            wait
            sleep 1
        done

    ;;

    x-stop )

        echo "Stopping daemon watchdog"
        PID=$(cat $WATCHDOGPIDFILE)
        kill $PID

    ;;

    x-status )
        #check if process is running and PID file exists, and report it back
    ;;
    x )
        echo "Usage {start|stop|status}"
esac

exit 0
Sign up to request clarification or add additional context in comments.

Comments

1

It sounds like you want a tool like forever. There's a getting started blog post here.

There are also more generic tools like monit and upstart.

I am personally using forever on my side project and it has worked just fine.

1 Comment

I really like forever but was having some issues getting it to work right daemonizing scripts that run on more recent versions of node; I ended up going with Upstart, which also works pretty well.
1

This gets complicated quickly. What you are really asking for is how to "daemonize" a process. It's more than simply running it in the background. Ideally you want to be running it in such a way that it doesn't tie down removable filesystems, and you want to be keeping its log output and not having it spitting to your old terminal. You don't want it accidentally killed when your shell exits, etc...

If you are on a Debian-based system like Ubuntu, the /sbin/start-stop-daemon does much of what you want. Writing an Ubuntu Upstart configuration for it was mentioned, and that's an option too. On other distros like Fedora, systemd provides what is generally considered the "gold plated" version of this automatic daemonization service. It can daemonize and manage basically any program that isn't explicitly interactive.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.