Debian 9 で Node.js アプリケーションをサービスとして実行しようとしています。だから私はいくつかのチュートリアルに従って同様のサービスを作成しました。
[Unit]
Description=bumer API Http Server
[Service]
PIDFile=/tmp/bumer-service.pid
User=root
Group=root
Restart=always
KillSignal=SIGQUIT
WorkingDirectory=/root/bumer/
SyslogIdentifier=bumer
ExecStart=/root/bumer/app.js
[Install]
WantedBy=multi-user.target
私のアプリケーションには#!/usr/bin/env node
最初の行があり、コマンドを実行すると正常に実行されます/root/bumer/app.js
。問題は、サービスの起動時に次のエラーが発生することです。
main process exited, code=exited, status=127/n/a
だから私はapp.jsファイルの最初の行を「node」という単語の代わりにノードパスに変更しようとしましたが、これはうまくいきます#!/usr/bin/env /usr/local/lib/nodejs/node-v8.11.4/bin/node
。サービスがPATH変数を読んでいないようですが、なぜ読まないのかを理解するのに役立ちます。
(私のパスは正しいので、「type node」を実行すると結果が良いです。)
root@bumer:~# type node
node is /usr/local/lib/nodejs/node-v8.11.4/bin/node
(app.jsの〜/ .bashrcに設定したPORT変数を記録していますが、読み取ることもできず、記録しますundefined
。)
答え1
サービスはログインセッションコンテキスト内で実行されません。
あなたPATH
はいいえPATH
はい、ログインセッション内のシェルの値は、シェルの起動スクリプトと同様にまったく関係ありません。
サービス管理システム(通常はsystemdに限定されない)の特徴の1つは、すべてのサービスを変更するなど、単一の統合環境に基づいて開始することです。ただサービスによって定義された要素です(何でも)。これは、ログインシェルがログインセッションのユーザーエクスペリエンスを設定する方法とは関係ありません。 (いいえ、root
ログインセッションのコンテキストではありません。)
systemdの場合、サービス定義はサービス単位ファイルであり、PATH
その単位で変更しない限り、デフォルト値は何でもあります。すべてのサービスは。 systemdの場合、これは文書化されています/usr/local/lib/nodejs/node-v8.11.4/bin/
。いいえリストに。
すべてのサービスに対してデフォルト以外のサービスを使用する場合は、設定を使用してサービスユニットを変更して変更する必要がありPATH
ます。Environment=
追加読書
- Lennart Petlinget al。 (2017). 」生成されたプロセスの環境変数」。 システムランチャー。システムのマニュアルページ。 freedesktop.org.