Mojoliciousアプリをデーモン化(centos6.5, ubuntu12.04?14.04)

# CentOS 6.5

修正箇所

スクリプト上部のコメント部も適宜編集して下さい。

anyenvもしくはplenvのあるユーザのホームディレクトリを指定
Mojoliciousディレクトリの指定
anyenv もしくはplenvに変更
デーモン名 autologger から自分のMojolicousアプリ名に変更
修正したファイルについて

権限 chmod 755 damone_file
/etc/init.dに配置
chkconfigでランレベルによるデーモンの起動設定。

```language:daemon.sh
#!/bin/bash
# chkconfig: 345 91 05
# description: Autologger server daemon
#
# Init file for Autologger server daemon
#
#
# pidfile: /home/yasu/project/auto_logger/script/hypnotoad.pid

# Source function library
if [ -f /etc/init.d/functions ] ; then
	. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
	. /etc/rc.d/init.d/functions
else
	exit 1
fi

unset TMPDIR
RETVAL=0

# 修正１　自分のホームに
HOME=/home/yasu
export HOME
# 修正２　mojoliciousアプリのディレクトリ指定
APP_HOME=$HOME/auto_logger
export APP_HOME
# 修正３ anyenv or plenvの指定
export PATH=$PATH:$HOME/.anyenv/bin
eval "$(anyenv init -)"

start()
{
# autologger -> 自分のアプリ名、yasu->自分のホーム
	echo -n $"Starting autologger service: "
	cd $APP_HOME;
#	daemon --user yasu $APP_HOME/startup h 2>/dev/null
	daemon $APP_HOME/startup h 2>/home/yasu/log
	RETVAL=$?
	echo_success
	echo
# 修正4
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/autologger || RETVAL=1
	return $RETVAL
}

stop()
{
	echo -n $"Shutting down autologger service: "
#	killproc autologger
	if [ ! -f /var/lock/subsys/autologger ]; then
		echo
		echo -n "autologger is not runnning"
		echo_failure
		echo
		return $RETVAL
	fi
	cd $APP_HOME
	daemon "$APP_HOME/startup hs" 2>/dev/null
	RETVAL=$?
# 修正5
	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/autologger
	echo
	return $RETVAL
}

reload()
{
	echo -n $"Reloading autologger service: "
	killproc autologger -SIGUSR2
	RETVAL=$?
	echo
	return $RETVAL
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	reload)
		reload
		;;
	restart)
		stop
		start
		;;
	status)
# 修正６
		status -p $APP_HOME/script/hypnotoad.pid autologger
		;;
	*)
		echo $"Usage: $0 {start|stop|reload|restart|status}"
		exit 2
esac
exit $?
``` 

# Ubuntu14.04

以下のスクリプトを各自の環境に合わせて修正してください。

修正箇所

anyenvもしくはplenvのあるユーザのホームディレクトリを指定
anyenv もしくはplenvに変更
登録するデーモン名
Mojoliciousディレクトリの指定
起動オプション（startupスクリプトの使用前提）
修正したファイルについて

権限 chmod 755 damone_file
/etc/init.dに配置
sysv-rc-confでランレベルによるデーモンの起動設定。

```language:daemon.sh
#! /bin/bash
### BEGIN INIT INFO
# Provides:          autologger2
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: Foo Bar <foobar@baz.org>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# 修正１
HOME=/home/yasu
export HOME
# 修正２
export PATH=$PATH:/home/yasu/.anyenv/bin
eval "$(anyenv init -)"

DESC="Description of the service"
# 修正３
NAME=autologger2
# 修正４
DAEMON_HOME=$HOME/project/auto_logger
DAEMON=$DAEMON_HOME/startup
#DAEMON_ARGS="--options args"
# 修正５
DAEMON_START_ARGS="h"
DAEMON_STOP_ARGS="hs"
PIDFILE=$DAEMON_HOME/script/hypnotoad.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
#	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
	start-stop-daemon -d $DAEMON_HOME --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null  \
		|| return 1
#	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
	start-stop-daemon -d $DAEMON_HOME --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_START_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
#	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	start-stop-daemon --stop --quiet --pidfile $PIDFILE --name --exec $DAEMON -- 'hs'
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
#	start-stop-daemon -d $DAEMON_HOME --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	start-stop-daemon -d $DAEMON_HOME --start --quiet --oknodo --exec $DAEMON -- $DAEMON_STOP_ARGS
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
#	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
	status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
	;;
  #reload|force-reload)
	#
	# If do_reload() is not implemented then leave this commented out
	# and leave 'force-reload' as an alias for 'restart'.
	#
	#log_daemon_msg "Reloading $DESC" "$NAME"
	#do_reload
	#log_end_msg $?
	#;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
		# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

:
```