Skip to content
Create a gist now

Instantly share code, notes, and snippets.

/etc/init.d script for unicorn
# init.d script for single or multiple unicorn installations. Expects at least one .conf
# file in /etc/unicorn
# Modified by
# based on by
## A sample /etc/unicorn/my_app.conf
## RAILS_ENV=production
## RAILS_ROOT=/var/apps/www/my_app/current
# This configures a unicorn master for your app at /var/apps/www/my_app/current running in
# production mode. It will read config/unicorn.rb for further set up.
# You should ensure different ports or sockets are set in each config/unicorn.rb if
# you are running more than one master concurrently.
# If you call this script without any config parameters, it will attempt to run the
# init command for all your unicorn configurations listed in /etc/unicorn/*.conf
# /etc/init.d/unicorn start # starts all unicorns
# If you specify a particular config, it will only operate on that one
# /etc/init.d/unicorn start /etc/unicorn/my_app.conf
set -e
sig () {
test -s "$PID" && kill -$1 `cat "$PID"`
oldsig () {
test -s "$OLD_PID" && kill -$1 `cat "$OLD_PID"`
cmd () {
case $1 in
sig 0 && echo >&2 "Already running" && exit 0
echo "Starting"
sig QUIT && echo "Stopping" && exit 0
echo >&2 "Not running"
sig TERM && echo "Forcing a stop" && exit 0
echo >&2 "Not running"
sig USR2 && sleep 5 && oldsig QUIT && echo "Killing old master" `cat $OLD_PID` && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
sig USR2 && echo Upgraded && exit 0
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
sig USR1 && echo rotated logs OK && exit 0
echo >&2 "Couldn't rotate logs" && exit 1
echo >&2 "Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"
exit 1
setup () {
echo -n "$RAILS_ROOT: "
cd $RAILS_ROOT || exit 1
export PID=$RAILS_ROOT/tmp/pids/
export OLD_PID="$PID.oldbin"
CMD="/usr/bin/unicorn_rails -c config/unicorn.rb -E $RAILS_ENV -D"
start_stop () {
# either run the start/stop/reload/etc command for every config under /etc/unicorn
# or just do it for a specific one
# $1 contains the start/stop/etc command
# $2 if it exists, should be the specific config we want to act on
if [ $2 ]; then
. $2
cmd $1
for CONFIG in /etc/unicorn/*.conf; do
# import the variables
# run the start/stop/etc command
cmd $1
ARGS="$1 $2"
start_stop $ARGS
zaius commented May 10, 2011

Thanks for this!


Very cool.

Just one issue: How to use with RVM and different gemsets?



@fernandokosh -

I actually made a small change to use with rvm... and with current unicorn instead of unicorn_rails. The gist is here.


Very elegant your solution.
Thanks @canweriotnow.

troex commented Sep 2, 2011

Nice script, I've made another implementation with bundle exec and unicorn.rb in /etc/unicorn trx's unicorn init


troex, nice implementation with bundle exec and unicorn.rb.

troex commented Dec 27, 2011

@fernandokosh thanks! I'll keep updating and make it more flexible also some examples are needed.


troex, and how about run with per projects gemsets? Imagine you have the project in /home/user/projects/app1. We need to activate /home/user/projects/app1/.rvmrc to correct load the gemset. I'm trying to do it, but...

Any idea?


troex commented Dec 30, 2011

@fernandokosh I haven't used RVM so I don't what it needs to be activated, but in my implementation you can define your own START_CMD variable. Keep asking in my gist please.

zewelor commented May 6, 2012

@fernandokosh i have modified that script to support for per project specific gemsets. You can check it here:


@fernandokosh i have modified the script for supporting for RVM on Mac OS X


One thing, when sending USR2 on upgrade, you still need to verify the new process is working and send QUIT to the .oldbin unicorn master.


It would be great if you could add a status command, since I would need it for my saltstack server provisioning.. Thanks!


I tried following and it works fine for me:

  sig 0 && echo >&2 "Already running" && exit 0
  echo >&2 "Unicorn is not running."
  exit 1
njd5475 commented Jun 23, 2015

Am I missing something, where is the pid file created?

iturgeon commented Jul 7, 2015

@njd5475 the setup around line 50 shows the pid files in the app/tmp/pids directory

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.