システムレベルでカスタムサービスを構築しようとしています。端末で直接実行すると正常に実行されるスクリプトがあります。このスクリプトは特定ですコンダ次に、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=simple
systemdは、によって開始されたプロセスがExecStart
フォアグラウンドで実行され続けると予想します。
この問題を解決する方法は2つあります。
使用しないで
/path/to/insightd.sh
スクリプトを確認し、必要なコマンドを抽出してフォアグラウンドでサービスを開始してください。に変更 。から
Type=simple
Type-forking
文書:に設定すると、構成された
forking
プロセスが開始の一部として呼び出されるExecStart=
と予想されます。fork()
起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続き基本サービスプロセスとして実行され、親プロセスが終了すると、サービスマネージャはそのユニットが開始されたと見なす。これは既存のUNIXサービスの動作です。この設定を使用する場合は、PIDFile=
systemdがサービスの基本プロセスを確実に識別できるように、このオプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。