#!/bin/bash -e set -u . $APPSH_HOME/.app/lib/app-conf pid_file=$APPSH_APPS/.app/var/pid/$APPSH_NAME-$APPSH_INSTANCE.pid bin=`get_conf $APPSH_APPS $APPSH_NAME $APPSH_INSTANCE app.bin` cd $APPSH_APPS/$APPSH_NAME/$APPSH_INSTANCE/current if [ -z "$bin" ] then echo "Missing required configuration: app.bin." >&2 exit 1 fi if [ ! -r "$bin" ] then echo "No such file: $bin" >&2 exit 1 fi chmod +x "$bin" PID= if [ -r $pid_file ] then PID="`cat $pid_file`" fi do_status() { if [ -z "$PID" ] then echo stopped else if [ `ps -p "$PID" 2>/dev/null | wc -l` -gt 1 ] then echo running else echo crashed fi fi } method_start() { case `do_status` in running) echo "The application is already running as $PID." exit 1 ;; esac $bin <&- 1<&- 2<&- & PID=$! echo "Application launched as $PID" echo $PID > $pid_file return 0 } method_stop() { case `do_status` in stopped) echo "The application not running." exit 1 ;; crashed) echo "The application crashed. Was running as $PID" # TODO: should this remove the PID file? # That makes it possible to run "stop" to stop "status" from showing "crashed" exit 1 ;; esac signal="-9" echo -n "Sending kill $signal to $PID, waiting for shutdown" kill $signal $PID while [ "`do_status`" == "running" ] do sleep 1 echo -n "." done echo " OK" rm -f $pid_file return 0 } method_status() { case `do_status` in running) echo "$APPSH_NAME/$APPSH_INSTANCE is running as $PID" ;; stopped) echo "$APPSH_NAME/$APPSH_INSTANCE is not running" ;; crashed) echo "$APPSH_NAME/$APPSH_INSTANCE crashed. Was running as $PID" ;; esac } case "$APPSH_METHOD" in start) method_start ;; stop) method_stop ;; status) method_status ;; *) exit 1 ;; esac exit $?