systemdがサービスを開始した直後に停止するのはなぜですか?

systemdがサービスを開始した直後に停止するのはなぜですか?

システムレベルでカスタムサービスを構築しようとしています。端末で直接実行すると正常に実行されるスクリプトがあります。このスクリプトは特定ですコンダ次に、CLIを使用してWebアプリケーションのローカルインスタンスを起動します。

問題...サービスを起動すると、Conda環境がアクティブになり、CLIを呼び出してアプリケーションが起動します。アプリケーションが完全に起動してから30秒以内に停止します。私はSimple Typeサービスを使用しています。私が読んだことによれば、サービスが開始されて実行を続け、Control+を押すC かサービスを停止するまでプロンプトを返さない場合は、このタイプを使用する必要があります。

journalctl -u my_service.serviceアプリケーションのログ(データベースからのデータのインポート、データベースの起動、および実行中のポート)を表示し、終了ログをプッシュします(アプリケーションの停止...)。

これは私のサービスです。

[Unit]
Description=Testing
After=network.target

[Service]
Type=simple
ExecStart=/path/to/insightd.sh start
ExecStop=/path/to/insightd.sh stop
ExecReload=/path/to/insightd.sh restart
WorkingDirectory=/path/to/working-dir
Restart=on-failure

[Install]
WantedBy=multi-user.target

ベストアンサー1

以前のsystem-vスタイルinitスクリプトの場合は、バックグラウンド/path/tp/insightd.shでコマンドを開始できます。システム的な観点から見るとType=simple、これはサービスの開始後すぐに終了したようです。

の場合、Type=simplesystemdは、によって開始されたプロセスがExecStartフォアグラウンドで実行され続けると予想します。

この問題を解決する方法は2つあります。

  1. 使用しないで/path/to/insightd.shスクリプトを確認し、必要なコマンドを抽出してフォアグラウンドでサービスを開始してください。

  2. に変更 。からType=simpleType-forking文書:

    に設定すると、構成されたforkingプロセスが開始の一部として呼び出されるExecStart=と予想されます。fork()起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続き基本サービスプロセスとして実行され、親プロセスが終了すると、サービスマネージャはそのユニットが開始されたと見なす。これは既存のUNIXサービスの動作です。この設定を使用する場合は、PIDFile=systemdがサービスの基本プロセスを確実に識別できるように、このオプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。

おすすめ記事