
16.04 にアップグレードした後、systemd を初めて使用していますが、サービスの起動と再起動で問題が発生しています。(たとえば) を実行すると...
systemctl start djalbat.com
... 動作しているように見えますが、プロンプトが返されず、ハングしてctrl-c
いるように見えます。プロンプトが返されてからサービスが起動したかどうかをテストすると、起動したようです。これが発生する原因は構成に何があるのでしょうか? 原因は次のとおりです。
[Unit]
Description=djalbat.com
[Service]
Type=forking
WorkingDirectory=/var/www/djalbat.com/
ExecStart=/usr/bin/node ./bin/main.js start 2>&1 >> /var/log/djalbat.com.log
[Install]
WantedBy=multi-user.target
また、最後のWantedBy
指示の必要性を指摘していただけるとありがたいです。
答え1
つまり、設定で実行されるコマンドExecStart
はフォーク一方、systemd
サービスは実行可能ファイルのフォーク用に構成されていました。これにより、systemctl
実行可能ファイルのフォークを待機することになり、コマンド ラインが返されなくなります。
実行可能ファイルの正しい設定は、フォークを使用することですType=simple
。
[Unit]
Description=djalbat.com
[Service]
Type=simple
WorkingDirectory=/var/www/djalbat.com/
ExecStart=/usr/bin/node ./bin/main.js start 2>&1 >> /var/log/djalbat.com.log
[Install]
WantedBy=multi-user.target
WantedBy
このユニットをターゲットに接続するために が必要なので、適切なターゲットに到達したときにこのユニットまたはサービスが自動的に起動し、サービスが自動的に起動するように有効化されます。
systemctl enable djalbat
systemd
サービスファイルに変更を加えた後は、必ず更新してください。
systemctl daemon-reload