サービスはログインセッションコンテキスト内で実行されません。

サービスはログインセッションコンテキスト内で実行されません。

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=

追加読書

おすすめ記事