システムスクリプトから分岐

システムスクリプトから分岐

systemd サービスがフォークを処理したい。 (私のファイル自体はフォークを処理しません。だからそれを処理するためにsystemdに依存しています。)

私の.serviceファイル:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

質問

Type=forking私が達成したい目的には十分な仕様がありますか?それとも、私のサービスがフォーク/デーモンを処理するという事実をupstartに実際に知らせるupstartでフォークを期待するのと似ていますか(正しく理解しているかどうかわからない場合は、initスクリプトの作成が初めてです)。

答え1

systemdには素晴らしいドキュメントがあります。ページを見るサービスファイル:

ブランチに設定されている場合、ExecStart =で設定されたプロセスは開始の一部としてブランチ()を呼び出す必要があります。起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続きデフォルトデーモンとして実行されます。これは従来のUNIXデーモンの動作です。この設定を使用する場合は、systemdがデーモンのデフォルトプロセスを識別できるように、PIDFile =オプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。

したがって、これを使用すると、systemdに戻りをtype待ってから、まだ実行中だと思います。これを実装することは依然としてあなたの責任です...swamp

答え2

systemdでフォークを処理するには、たとえばまたはを使用するType=simple必要がありますType=notify。その後、systemdはフォーク操作を実行します。

swamp実行可能ファイルを変更できる場合は、これがType=notify最善の解決策です。実行可能ファイルが正常に初期化されたら、systemdに通知する必要があります。これはsystemctl start swamp、コマンドラインから呼び出されたときにswampが初期化されるのを待ち、コマンドラインを初期化するときに通常必要なエラーメッセージを出力することを意味します。

Type=notify で作成された実行可能ファイルの例については、次のシェルスクリプトを参照してください。

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000

関連情報