![サービスを開始または再起動するとsystemdがハングする](https://rvso.com/image/898924/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%BE%E3%81%9F%E3%81%AF%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%A8systemd%E3%81%8C%E3%83%8F%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B.png)
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