LoginSignup
4
2

More than 5 years have passed since last update.

Norikraのinit shell scriptを共有

Last updated at Posted at 2015-11-06

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 コマンドから直接起動しています。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2