Running Compojure as a Service

My usual setup for running Compojure web apps is to run Jetty from ant and run ant in a screen session so it doesn't get killed when I log off. This got harder to manage as I move more applications to Compojure, I ended up with six consoles running. If you are not careful or update apps six in the morning, you end up killing the wrong app.

I got tired of this and hacked the following bash script, with it I can start/stop Compojure apps much like a service. No need to keep screen running.

You need to set the following variables,

  • NOHUP - Location of the nohup binary.
  • JAVA - Location of the java binary.
  • JARFOLDER - Folder containing Compojure jars.
  • ROUTES - Entry point for your application.

Thats all the setup that is needed.

#!/bin/bash

DESC="Compojure"
NAME="nakkaya.com"

NOHUP="nohup"
JAVA="java"
JARFOLDER="extLibs/"
PID_FILE="comp.pid"
ROUTES="app/routes.clj"

## build jar list
JARS="-cp "

for i in `find $JARFOLDER -name *.jar`
do
    JARS=${JARS}:${i}
done

d_start(){
    if [ -e $PID_FILE ] 
    then
        PID=$(cat $PID_FILE)
        if ps -p $PID > /dev/null
        then 
            echo "$NAME already running.."
            exit 0
        fi
    fi

    $NOHUP $JAVA $JARS clojure.main $ROUTES &
    COMPOJURE_PID=$!
    echo $COMPOJURE_PID > $PID_FILE
}

d_stop(){
    if [ -e $PID_FILE ] 
    then
        COMPOJURE_PID=$(cat $PID_FILE)
        kill $COMPOJURE_PID
        rm $PID_FILE
    else
        echo "$NAME is not running.."
    fi
}

case "$1" in
    start)
        echo "Starting $DESC: $NAME"
        d_start
        ;;
    stop)
        echo "Stopping $DESC: $NAME"
        d_stop
        ;;
    *)
        echo "Usage: compctl {start|stop}"
        exit 1
        ;;
esac

exit 0

What we do is run Java using "nohup", this way process won't get killed when we log off. "nohup" redirects the output to nohup.out, PID of the Java process is saved to a file called "comp.pid".