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
になってます。
#!/bin/bash
cd /home
nohup gulp </dev/null &>/dev/null &
ここ勘違いしてたんですが、daemonで実行ファイルを動かせば勝手にバックグラウンドになると思っていたので、当初は3行目は単純にgulp
とだけ書いてありました。ですが動かしたところいつまでたってもサービスが起動しない(watchがフォアグラウンドで動き続ける)ことから今回のような実装になってます。
- 実行シェル
長くなるので要点だけ書きます。
#!/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等使えるので若干管理が楽になったと前向きに捉えることにします。
以上。