Debian(Jessie)でdaemontoolsを使用してNode.jsサーバーを実行しようとしていますが、実行中のスクリプトはsupervise
再起動し続けます。これは私が使用している実行スクリプトです(/etc/service/node/run
)。
#!/bin/bash
exec setuidgid nodeuser bash -c './node'
スクリプトはuserとして次のスクリプトを実行しますnodeuser
。ここでNVMをロードしてコードディレクトリに変更して、Node.jsサーバーを実行します。
#!/bin/bash
# Load NVM because we are in a non-interactive shell
export NVM_DIR="/home/nodeuser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
# Run server
cd /path/to/code
exec node server.js
スタートアップサービスを使用すると、sudo svc -u /etc/service/node
プロセスは常に再起動され、ps faux
次のプロセス階層が表示されます(階層の深さは常に変更されます)。
/bin/sh /usr/bin/svscanboot /etc/service/
\_ svscan /etc/service
\_ supervise node
\_ /bin/bash ./node
\_ /bin/bash ./node
\_ /bin/bash ./node
\_ /bin/bash ./node
\_ /bin/bash ./node
| \_ /bin/bash ./node
| \_ /bin/bash ./node
| | \_ /bin/bash ./node
| | \_ /bin/bash ./node
| \_ /bin/bash ./node
| \_ tail -n1
\_ /bin/bash ./node
\_ tail -n1
そこで何が起こったのか知っていますか?スクリプトを手動で実行すると、./run
サーバーが期待どおりに起動し、コンソールに出力が表示されます。
編集する
サービスを再起動した後にのみ機能することがわかりました。 .itで再起動すると、sudo svc -du /etc/service/node
上記のように動作します。
ベストアンサー1
そのスクリプトが間違っています。 daemontoolsシリーズのモットーは、実行されるプログラムが./run
サービスプロセスでなければならないということです。それ自体、親、祖父母、または他の親戚ではありません。サービスは作成されずに実行されます。
最後の行の使用はexec
正しい考えですが、次の明示的な使用のために壊れていましたbash -c
。とにかく、./node
スクリプトには#!/bin/bash
スクリプトインタプリタがあり(おそらく)実行可能であるため、これは必要ありません。より良いもの
#!/bin/bash setuidgid node user ./node 実行
これは確かにnosh
(から同名のツールセット) またはexeclineb
コマンドを実行するために重量級Bourne Againシェルは実際には必要ないため、スクリプトですsetuidgid
。したがって:
#!/空/ノッシュ setuidgid ノードユーザー 。 /節または
#!/コマンド/execlineb -P s6-setuidgid ノードユーザー 。 /節
その後、サービス管理者がサービスの終了に応答すると、svc -d
正しい実際のサービスプロセスにシグナルを送信します。
追加読書
- ヒムデル(2013-07-24)。 Apacheとdaemontoolsを使用したNode.jsのデプロイ。セグメンテーションエラー。
- スティーブキャンプ(2014-01-04)。runitを使用したサービスの維持。 Debian 管理。