daemontoolsの設定を自動で設定するシェルスクリプト（備忘録）

# 前提条件
- daemontoolsが使えるようになっていること

以上（笑）

# シェルスクリプト作成
以下のシェルスクリプトをPATHが通っているところに置いて、実行のパーミッションを付けます。
この記事では「**daemonctl**」という名前で作成したとして説明します。

```bash:daemonctl
#!/bin/sh

# Current working directory
CWD=`pwd -P`

SERVICE=`pwd | awk -F"/" '{print $NF}'`

# Options
OPT=$1
SCRIPT=$2

# Display help
if [ -z $OPT ]; then
  echo "Usage: "`echo $0 | awk -F"/" '{print $NF}'`" [option]"
  echo "  start: start service."
  echo "   stop: stop service."
  echo "restart: restart service."
  exit
fi

# When in stop mode, if there was no service directory.
if [ "$OPT" != "stop" ]; then
  if [ ! -f "$SCRIPT" ]; then
    START="$CWD/start.sh"
  else
    START=$SCRIPT
  fi

  if [ ! -f "$START" ]; then
    echo "require start.sh script."
    exit
  fi
fi

if [ ! -d "$CWD/service/$SERVICE" ]; then
  mkdir -p $CWD/service/$SERVICE
  cat << EOF > $CWD/service/$SERVICE/run
#!/bin/sh

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

cd $CWD
exec $START
EOF
  chmod 755 $CWD/service/$SERVICE/run
fi

#=============================================================================
# Start daemon
#=============================================================================
if [ "${OPT}" = "start" ]; then
  if [ ! -L /etc/service/$SERVICE ]; then
    ln -s $CWD/service/$SERVICE /etc/service/
  fi
        svc -u /etc/service/$SERVICE > /dev/null 2>&1
  echo "Start daemon service [$SERVICE]."

#=============================================================================
# Stop daemon
#=============================================================================
elif [ "${OPT}" = "stop" ] && [ -L /etc/service/$SERVICE ]; then
  svc -d /etc/service/$SERVICE > /dev/null 2>&1
  rm -rf /etc/service/$SERVICE
  PID=`ps ax | grep "supervise $SERVICE" | grep -v 'grep' | awk '{print$1}'`
        kill -9 $PID
  echo "Stop daemon service [$SERVICE]."

#=============================================================================
# Restart daemon
#=============================================================================
elif [ "${OPT}" = "restart" ]; then
  svc -d /etc/service/$SERVICE > /dev/null 2>&1 && svc -u /etc/service/$SERVICE > /dev/null 2>&1
  echo "Restart daemon service [$SERVICE]."
fi
```

パーミッションは、

```bash
$ chmod 755 daemonctl
```
みたいな感じで付けてください。

# スクリプト解説
とりあえずはdaemontoolsで監視したいツールのディレクトリに入ります。
ディレクトリが無い場合は、適当な場所にディレクトリを作って入ります。
そこに「**start.sh**」という名前で、ツールの起動スクリプトを書きます。
「**exec**」で起動するようにしないと上手くdaemontoolsで監視してくれないっぽい。

起動スクリプトが作成出来たら、以下のような感じで実行します。

```bash
$ daemonctl start
```

すると、カレントディレクトリにある「**start.sh**」を起動スクリプトとしてdaemontoolsがツールを起動し、プロセス監視を開始します。
実行すると「**[カレントディレクトリ]/service/[カレントディレクトリ名]**」というディレクトリが作成されているはず。
例）
カレントディレクトリが「**minecraft**」だった場合、「**./service/minecraft**」というディレクトリが作成されているはず。
これが、daemontoolsが監視するために使用するディレクトリ。
通常はエディタなどで中にある「**run**」というファイルを記述して「**/etc/service**」配下にシンボリックリンクを貼ったりしないといけなかったが、それをシェルスクリプトで実行するようにしてあります。
実行してエラーなどが出なかった場合に、

```bash
$ ps ax | grep minecraft
```
などとプロセスを確認してみると、superviseと、起動されたツールの2つが出てくると思います。
ここで、

```bash
$ daemonctl stop
```
と実行すると、ツールが停止し、daemontoolsの監視が止まります。
プロセスで確認すると、先程の2つのプロセスがなくなっているのが確認出来るはず。

```bash
$ daemonctl start [起動スクリプトのPATH]
```
とやると、「**start.sh**」以外の起動スクリプトを指定することも出来ます。

# daemontoolsってなに？
という人はググってください。
Windows用のツールで同名の、光学メディアマウントツールがありますので、上手くググってください。