0

I am working on a unicorn shell script that is suposed to start/stop/restart unicorn. How ever I am having a bit of trouble getting it to actually work.

Any help with this is greatly appreciated.

When I run the shell script (sh unicorn_init.sh) I get the following output.

    kill: 72: No such process

    unicorn_init.sh: 72: cd /data/appname/staging/releases/20120823055753; bundle exec unicorn_rails -D -c /data/appname/staging/releases/20120823055753/config/unicorn.rb -E staging: not found

This is the current version of my shell script:

#!/bin/sh
set -e
# Example init script, this can be used with nginx, too,
# since nginx and unicorn accept the same signals

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/data/appname/staging/releases/20120823055753
SHARED_ROOT=/data/appname/staging/shared
PID=$SHARED_ROOT/pids/unicorn-staging.pid
CMD="cd $APP_ROOT; bundle exec unicorn_rails -D -c $APP_ROOT/config/unicorn.rb -E staging"
action="$1"
set -u

old_pid="$PID.oldbin"

cd $APP_ROOT || exit 1

sig () {
        test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
        test -s $old_pid && kill -$1 `cat $old_pid`
}

case $action in
start)
        sig 0 && echo >&2 "Already running" && exit 0
        "$CMD"
        ;;
stop)
        sig QUIT && exit 0
        echo >&2 "Not running"
        ;;
force-stop)
        sig TERM && exit 0
        echo >&2 "Not running"
        ;;
restart|reload)
        sig HUP && echo reloaded OK && exit 0
        echo >&2 "Couldn't reload, starting '$CMD' instead"
        "$CMD"
        ;;
upgrade)
        if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
        then
                n=$TIMEOUT
                while test -s $old_pid && test $n -ge 0
                do
                        printf '.' && sleep 1 && n=$(( $n - 1 ))
                done
                echo

                if test $n -lt 0 && test -s $old_pid
                then
                        echo >&2 "$old_pid still exists after $TIMEOUT seconds"
                        exit 1
                fi
                exit 0
        fi
        echo >&2 "Couldn't upgrade, starting '$CMD' instead"
        "$CMD"
        ;;
reopen-logs)
        sig USR1
        ;;
*)
        echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
        exit 1
        ;;
esac
2
  • By quick glance, you need to modify sig to (1) not display error output from kill if the process doesn't exist, and (2) not die. Because of the set -e your script will terminate if you try to terminate a process which is no longer running. It's not hard to fix, but coding for set -e is a bit more challenging. Commented Aug 23, 2012 at 6:55
  • Remove the quotes from around "$CMD" Commented Aug 23, 2012 at 7:01

1 Answer 1

2

The quotes around $CMD mean that the entire variable value is a command, including embedded spaces. Here is a simple example to illustrate:

/home/user1> CMD='echo hello'
/home/user1> $CMD
hello
/home/user1> "$CMD"
-bash: echo hello: command not found
/home/user1> 
Sign up to request clarification or add additional context in comments.

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.