2016年1月4日月曜日

node.js foreverをRaspberryPi起動時に自動起動するように設定する

node.jsをRaspberryPiでnvm管理下で使っていたのですが、サービスを常時動かしておこうとするとforever等で管理することになります。
ところが、foreverはinit.dに登録されているわけではないのでRaspberryPiを再起動すると自動で動いてくれません。
最初nvmを使ってnode.jsをinstallしていたのですが、nvmだと自分のアカウントのhomeの.nvmというディレクトリ以下に色々とinstallされてしまいシステムの起動スクリプトに記述するには気持ち悪い事になってしまいます。(まぁ、そこはそういうものだと割りきってしまっても良いのですが)
nvmは開発用の環境であって運用のための環境ではないということかと思います。
次に考えたのはapt-getでnode.jsをinstallすることですが、versionが0.10.29と古いため結局試行錯誤の末node.js自体はnodejs.orgのDOWNLOADSのLTSのv4.2.4を入れることにしました。
今回は/usr/local/にダウンロードしてきたイメージを展開して/usr/local/nodeにシンボリックリンクを張って運用しています。
ダウンロードの実体は/usr/local/node-v4.2.4-linux-armv7l/以下に展開されて、そこに/usr/local/nodeからシンボリックリンクされているという形です。
$ PATH=/usr/local/node/bin/:$PATH
とpathを通してから
$ npm install -g forever
でforverをinstallします。
これでnode, npm, foreverが準備出来たので、次に/etc/init.d/に起動スクリプトを用意します。

以下の例は/etc/init.d/ha1observerという名前で/var/ha1/ha1observer.jsにパラメータを付けて起動するためのものです。

-----
#!/bin/sh

### BEGIN INIT INFO
# Provides:          ha1observer.js
# Required-Start:    $network $syslog
# Required-Stop:     $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: forever running ha1observer.js
### END INIT INFO

USER=ha1observer
SCRIPT=/var/ha1/EventValidate.js
PIDFILE=/var/run/ha1observer.pid
LOGFILE=/var/ha1/ha1observer.log
PATH=/usr/local/node/bin:$PATH
FOREVER=/usr/local/node/bin/forever
NODE=/usr/local/node/bin/node
NODEAPP=/var/ha1/HA1Observer/ha1observer.js

start() {
  $FOREVER start --pidFile $PIDFILE -l $LOGFILE -a -d -c "$NODE $NODEAPP -u $USER -f $SCRIPT"
  RETVAL=$?
}

restart() {
  $FOREVER restart $NODEAPP
  RETVAL=$?
}

stop() {
  $FOREVER stop $NODEAPP
  RETVAL=$?
}

status() {
  $FOREVER list
  RETVAL=$?
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage:  {start|stop|status|restart}" >&2
    exit 1
    ;;
esac
exit $RETVAL

-----

ha1observer.jsは起動後に-uで渡されたユーザーにprocess.setuid()で切り替えて実行されます。
init.dからはrootで実行されるのでsetuidしないと色々と危険です。
これを準備したあと
$ update-rc.d ha1observer defaults 3 1
を実行することでrc?.dにシンボリックリンクが張られます。
再起動して
$ ps aux | grep ha1observer
で確認するときちんと実行されていることが分かります。

0 件のコメント:

コメントを投稿