FreeBSD用のNode.jsデーモン:forever + rc.d

Node.jsをサーバー側として使用してプロジェクトで作業する過程で、サービスとしてJSスクリプトを起動するという問題が発生しました。開始、停止、再起動などのすべての利点があります。 このトピックについては、原則としてすでに十分な情報がありますが、基本的にはLinuxでMonit + Initを使用するか、「use nodemon、Luke」のような短いヒントに要約されます。



私の場合、本番サーバーとしてFreeBSD上にマシンがありました。 JSファイルをプロセスとして起動するユーティリティとして、私は永遠に好きでした。 このことは、nodemonとは異なり、その下で実行されているプロセスを監視し、スクリプトソースの変更を待たずにクラッシュしたときにそれらを発生させることができます。 さらに、永久に実行中のプロセスの現在のリストを表示し、それらの稼働時間を表示できます。また、名前またはインデックスでプロセスを停止/再起動できます。



考え直さずに、rc.dスクリプトが作成されました。





#cat /usr/local/etc/rc.d/factory

#!/bin/sh # PROVIDE: factory # REQUIRE: NETWORKING SERVERS DAEMON # BEFORE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name="factory" forever="/usr/local/bin/node /usr/local/bin/forever" workdir="/usr/home/www/factory" script="index.js" rcvar=`set_rcvar` start_cmd="start" stop_cmd="stop" restart_cmd="restart" load_rc_config $name eval "${rcvar}=\${${rcvar}:-'NO'}" start() { HOME=/root NODE_ENV=production ${forever} start -a -l /var/log/forever.log -o /dev/null -e ${workdir}/logs/node_err.log --sourceDir ${workdir} ${workdir}/node/${script} } stop() { ${forever} stop ${workdir}/node/${script} } restart() { ${forever} restart ${workdir}/node/${script} } run_rc_command "$1"
      
      







/etc/rc.confに次の行が追加されました:factory_enable = "YES"。 その後、試用が行われました:/usr/local/etc/rc.d/factory startとスクリプトが正常に開始されました。 再起動と停止の作業も確認した後、お茶を注いで自分に満足しました。 同時に、戦闘状態でスクリプトの起動を確認するために、サーバーを送信して再起動しました。



お茶で戻って、私はブラウザを開いて、サーバーサイドが起動しなかったことがわかりました。 永久ログには以下が含まれていました。

 # cat /var/log/forever.log ... warn: Forever restarting script for 11119 time warn: Forever detected script exited with code: 127 warn: Forever restarting script for 11120 time warn: Forever detected script exited with code: 127 warn: Forever restarting script for 11121 time warn: Forever detected script exited with code: 127 warn: Forever restarting script for 11122 time warn: Forever detected script exited with code: 127 warn: Forever restarting script for 11123 time warn: Forever detected script exited with code: 127 warn: Forever restarting script for 11124 time
      
      







したがって、サービスが「開始」された瞬間から、子JSプロセスはすでに11124回低下/上昇しました。その間、私は熱湯でティーバッグを加熱していました。



コンソールから何かが起動されても、「クリーン」な環境で起動時に機能しないときはいつでも、内部の声は同じことをささやきます:「環境変数! しかし、どのように? 私は誰もが書いているHOMEを指摘し、NODE_ENV =生産はエクスプレスが機能するために必要です。 他に何が必要ですか?



また、ユーザー環境と起動時の環境の違いを比較する必要があります。 この比較の結果、rc.dスクリプトの「start」セクションに、USER、PATH、PWDの3つの環境変数が追加されました。 その後、JSスクリプトが正しく開始されました。 実際、rc.dスクリプトの作業バージョンは次のようになり始めました。



 #!/bin/sh # PROVIDE: factory # REQUIRE: NETWORKING SERVERS DAEMON # BEFORE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name="factory" forever="/usr/local/bin/node /usr/local/bin/forever" workdir="/usr/home/www/factory" script="index.js" rcvar=`set_rcvar` start_cmd="start" stop_cmd="stop" restart_cmd="restart" load_rc_config $name eval "${rcvar}=\${${rcvar}:-'NO'}" start() { USER=root PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin PWD=/root HOME=/root NODE_ENV=production ${forever} start -a -l /var/log/forever.log -o /dev/null -e ${workdir}/logs/node_err.log --sourceDir ${workdir} ${workdir}/node/${script} } stop() { ${forever} stop ${workdir}/node/${script} } restart() { ${forever} restart ${workdir}/node/${script} } run_rc_command "$1"
      
      







「これらのあなたのインターネット」で大騒ぎして、FreeBSDを実行しているマシンでnode.jsサービスがこのようにフェイルセーフで開始されることに関する情報の欠如に驚きました。 実際に私が書くことを決めたものは、突然誰かに役立つでしょう。



All Articles