develop環境で毎回手動で起動・停止していましたが、production環境へのデプロイが迫ってきたので init script を作りました。
せっかくなので共有しておきます。
norikra ユーザを作成し、rbenv 経由で jruby をインストールした環境から norikra ユーザを指定しての起動を想定していますが、script中の NORIKRA_USER、NORIKRA_GROUP を変更してもらえれば任意のユーザで起動出来ると思います。
役立てていただければ幸いです。
オプションの指定とか、諸々間違っていたりする点があればコメントからご指摘ください。
必要ディレクトリ
- /etc/norikra
- /var/log/norikra
- /var/run/norikra
→ 実行ユーザ&グループで作成
ファイル実体
-
/etc/sysconfig/norikra (chown root.)
NORIKRA_OPT="-Xmx4g -Xms4g -Xmn1g -XX:+UseConcMarkSweepGC -d"
→ 環境に合わせて設定してください。
-
/etc/rc.d/init.d/norikra (chown root. ;chmod +x)
#!/bin/bash # # Norikra init shellscript # Copyright 2015, Kedamari # # /etc/rc.d/init.d/norikra # # chkconfig: - 80 20 # description: norikra # processname: norikra # pidfile: /var/run/norikra/norikra.pid ########################## ### Disabled http_proxy ########################## unset http_proxy unset HTTP_PROXY ########################## ### Definition ########################## export PATH=/sbin:/usr/sbin:/bin:/usr/bin NORIKRA_NAME=Norikra NORIKRA_HOME=/etc/norikra NORIKRA_DEFAULT=/etc/sysconfig/norikra NORIKRA_USER=norikra NORIKRA_GROUP=norikra NORIKRA_LOG_DIR=/var/log/norikra NORIKRA_BIN_FILE=/home/norikra/.rbenv/shims/norikra NORIKRA_PID_FILE=/var/run/norikra/norikra.pid NORIKRA_LOCK_FILE=/var/run/norikra/norikra.lock NORIKRA_STATS_FILE=${NORIKRA_HOME}/norikra.json . "${NORIKRA_DEFAULT}" NORIKRA_OPTIONS="start ${NORIKRA_OPT} --pidfile=${NORIKRA_PID_FILE} --stats=${NORIKRA_STATS_FILE} --logdir=${NORIKRA_LOG_DIR} --middle" START_STOP_DAEMON_ARGS="-l ${NORIKRA_USER} -g ${NORIKRA_GROUP}" # timeout can be overridden from /etc/sysconfig/td-agent STOPTIMEOUT=120 RETVAL=0 # Source function library. . /etc/init.d/functions ########################## ### Function that starts ########################## do_start() { ulimit -n 65536 1>/dev/null 2>&1 || true echo -n "Starting ${NORIKRA_NAME}: " local RETVAL=0 runuser ${START_STOP_DAEMON_ARGS} -c bash -c "${NORIKRA_BIN_FILE} ${NORIKRA_OPTIONS}" || RETVAL="$?" [ $RETVAL -eq 0 ] && success && touch "${NORIKRA_LOCK_FILE}" || failure echo return $RETVAL } ########################## ### Function that stops ########################## do_stop() { echo -n "Shutting down ${NORIKRA_NAME}: " local RETVAL=0 if [ -e "${NORIKRA_PID_FILE}" ]; then # Use own process termination instead of killproc because killproc can't wait SIGTERM NORIKRA_PID=`cat "${NORIKRA_PID_FILE}" 2>/dev/null` ${NORIKRA_BIN_FILE} stop >/dev/null 2>&1 || RETVAL="$?" if [ $RETVAL -eq 0 ]; then TIMEOUT="$STOPTIMEOUT" while [ $TIMEOUT -gt 0 ]; do ${NORIKRA_BIN_FILE} stop >/dev/null 2>&1 || break sleep 1 let TIMEOUT="${TIMEOUT}-1" || true done if [ "$TIMEOUT" -eq 0 ]; then echo -n "Timeout error occurred trying to stop ${NORIKRA_NAME}..." RETVAL=1 failure || true else RETVAL=0 success fi else failure || true fi else failure || true RETVAL=4 fi echo [ $RETVAL -eq 0 ] && rm -f "${NORIKRA_PID_FILE}" && rm -f "${NORIKRA_LOCK_FILE}" return $RETVAL } ########################## ### Function that restarts ########################## do_restart() { do_stop || true do_start } case "$1" in "start" ) test -f ${NORIKRA_LOCK_FILE} || false do_start ;; "stop" ) do_stop ;; "restart" ) do_restart ;; "status" ) status -p "${NORIKRA_PID_FILE}" "${NORIKRA_NAME}" ;; * ) echo "Usage: $0 {start|stop|restart|status}" >&2 exit 1 ;; esac
startに daemon を使用したかったのですが、rbenv が $HOME の環境変数を直接叩く為、bash -c 経由で起動する必要があり、runuser コマンドから直接起動しています。