LoginSignup
4
2

More than 5 years have passed since last update.

無駄にターミナル常駐型のタスクをサービス化してみた

Last updated at Posted at 2017-02-17

gulpみたいなターミナルに常駐するタスクを実行するとき、
バックグラウンドで動かせたほうがずっとウィンドウ開かなくていいし、
仮想環境とかでも動かせるし便利だなと思って色々試したので書き残しておきます。

実行環境

vagrant 1.7.4(centos6.7)
VirtualBox 5.0.28

やりたかったこと

だれもが1回は使ったことあるsudo service httpd startのようにsudo service gulpd startでずっとファイルの変更をwatchしてる状態をつくる。

背景知識

基本的に下記一式が必要

1.実行ファイル(コマンドそのものでバイナリになってるものが多い)
/usr/sbin

2.実行シェル(ここでstart/stop/restartといったサービスの管理を定義する)
/etc/init.d/~
/etc/rc.d/init.d/~

3.pidfile(サービスが利用するプロセスIDが記憶される、killする際のID指定に用いる)
/var/run/~

4.lockfile(サービス起動時に作成される、起動判定に用いる)
/var/lock/~

pidfileとlockfileがわかりにくいんですが、サービスをstart/stop/restartといったコマンドで管理するためのものだと思ってもらえればよいと思います。
startするときはlockfileが存在しなければタスクを起動し、存在すれば既に起動しているという文言を提示する、
stopするときはpidfileに書き込まれたプロセスIDを指定してプロセスをkillするといった具合です。

長くなりましたが下記がgulpdデーモン化の実装になります。

実装

pidfile,lockfileは所定の場所に設置済みとお考えください。
実行ファイルと実行シェルを作成します。

  • 実行ファイル

gulpfileが置いてあるディレクトリまで移動しgulpコマンドを実行するだけのコマンドをgulpdとして定義しました。
/homeにgulpfileを設置しているのでcd /homeになってます。

gulpd.sh
#!/bin/bash
cd /home
nohup gulp </dev/null &>/dev/null &

ここ勘違いしてたんですが、daemonで実行ファイルを動かせば勝手にバックグラウンドになると思っていたので、当初は3行目は単純にgulpとだけ書いてありました。ですが動かしたところいつまでたってもサービスが起動しない(watchがフォアグラウンドで動き続ける)ことから今回のような実装になってます。

  • 実行シェル

長くなるので要点だけ書きます。

gulpd.sh
#!/bin/bash
#
# gulpd       Startup script for the gulpd
#
# chkconfig: - 98 11
# description: gulpd
# processname: gulpd
# pidfile: /var/run/gulpd.pid
#
# Source function library.
. /etc/rc.d/init.d/functions

GULPD_LANG=${GULPD_LANG-"C"}

INITLOG_ARGS=""

gulpd=${GULPD-/usr/sbin/gulpd}
prog=gulpd
pidfile=${PIDFILE-/var/run/gulp.pid}
lockfile=${LOCKFILE-/var/run/gulp.lock}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}

start() {
        echo -n $"Starting $prog: "
        LANG=$GULPD_LANG daemon --pidfile=${pidfile} $gulpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
    status -p ${pidfile} $gulpd > /dev/null
    if [[ $? = 0 ]]; then
        echo -n $"Stopping $prog: "
        killproc -p ${pidfile} -d ${STOP_TIMEOUT} $gulpd
    else
        echo -n $"Stopping $prog: "
        success
    fi
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    RETVAL=2
esac

exit $RETVAL

所感

daemonコマンドって指定したタスクをバックグラウンドで実行してくれる便利な関数だと思っていたんですが、実際のところはバックグラウンドで実行されるタスクを管理するためのものなんでしょうか、時間がある時にfunctionsのdaemon関数を読みたいなと思いました。
この辺はシェル芸が達者な人にお話を聞いてみたい。。。。

というかただバックグラウンドでタスクを動かしたいだけならnohup sudo gulp </dev/null &>/dev/null &を直接ターミナルに打ち込むだけで良かったりもします。
そんなこんなで色々書いてから気づいたので無駄もありましたが、start/stop等使えるので若干管理が楽になったと前向きに捉えることにします。

以上。

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