Redmine起動スクリプト(/etc/init.d/redmine)のサンプル


# 目的
[Ansbile-Redmine](https://github.com/volanja/ansible-Redmine)の起動スクリプト(/etc/init.d/redmine)がつたない感じなのでリファクタリングする。
Nginx等みたいに、[OK]とか[NG]とか出したい。
一回理解すれば他でも活用できそう。

[CentOSの起動スクリプト(/etc/init.d/redmine)を[OK]とか出せるようにリファクタリングする。 · Issue #7 · volanja/ansible-Redmine](https://github.com/volanja/ansible-Redmine/issues/7)

# 今回の環境
[Ansible-Redmine v0.1](https://github.com/volanja/ansible-Redmine/tree/v0.1)と同じ(たぶん)。

+ CentOS 6.4
+ rbenv 0.4.0-89-g14bc162
+ redmine 2.4.1
+ Unicorn 4.8.0


#起動コマンドの実行例
今回のリファクタリングで以下のようにすることができた。

```bash
# service redmine start
Starting redmine:              [  OK  ]

# service redmine restart
Stopping redmine:              [  OK  ]
Starting redmine:              [  OK  ]

# service redmine stop
Stopping redmine:              [  OK  ]

他にも、reloadなどがある。
```

# 起動スクリプト(/etc/init.d/redmine)のコード
コードは以下の通り。
方針としては、/etc/init.d/functionsを有効活用して自作しないようにする。

```bash
#! /bin/sh

# chkconfig: - 85 15

### BEGIN INIT INFO
# Provides:          redmine
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Redmine Project management software
# Description:       Redmine Project management software
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

### Environment variables
RAILS_ENV="production"

# Feel free to change any of the following variables for your app:
APP_ROOT=/home/redmine/redmine
APP_USER="redmine"
PID=${APP_ROOT}/tmp/pids/unicorn.pid
CMD="/home/redmine/.rbenv/shims/bundle exec unicorn_rails -D -c ${APP_ROOT}/config/unicorn.rb -E ${RAILS_ENV}"
INIT_CONF=${APP_ROOT}/config/init.conf
action="$1"
RETVAL=0
prog="redmine"

test -f "${INIT_CONF}" && . ${INIT_CONF}

cd ${APP_ROOT} || exit 1

start(){
  echo -n $"Starting $prog: "
  daemon --pidfile=${PID} --user=${APP_USER} "cd ${APP_ROOT} && ${CMD}" 
  RETVAL=$?
  echo
}

stop(){
  echo -n $"Stopping $prog: "
  killproc -p ${PID} ${prog} -QUIT
  RETVAL=$?
  echo
}

rh_status() {
    status -p ${PID} ${prog}
}

force_stop(){
  echo -n $"Force-Stopping $prog: "
  killproc -p ${PID} ${prog} -TERM
  RETVAL=$?
  echo
}

reload(){
  echo -n $"Reloading $prog: "
  killproc -p ${PID} ${prog} -HUP
  RETVAL=$?
  echo
}

upgrade(){
  old_pid=${PID}.oldbin
  echo -n $"Staring new master $prog: "
  killproc -p ${PID} ${prog} -USR2
  RETVAL=$?
  echo
  sleep 2
  if [ -f ${old_pid} -a -f ${PID} ]; then
      echo -n $"Graceful shutdown of old $prog: "
      killproc -p ${old_pid} ${prog} -QUIT
      RETVAL=$?
      echo 
  else
      echo $"Upgrade failed!"
      return 1
  fi
}

reopen_logs(){
  echo -n $"ReOpening Logs $prog: "
  killproc -p ${PID} ${prog} -USR1
  RETVAL=$?
  echo
}

case $action in
start)
  start
  ;;
stop)
  stop
  ;;
status)
  rh_status
  ;;
force-stop)
  force_stop
  ;;
restart)
  stop
  sleep 2
  start
  ;;
reload)
  reload
  ;;
upgrade)
  upgrade
  ;;
reopen-logs)
  reopen_logs
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
  exit 1
  ;;
esac
exit 0
```

# 参考
[/etc/init.d/functions を読む](http://d.hatena.ne.jp/tashen/20081124/1227548098)
[/etc/init.d/functions の解説](http://darutk-oboegaki.blogspot.jp/2012/10/etcinitdfunctions.html)