systemd fork vs simple?


24

最初のsystemdユニットファイルを作成しています。

以下のためにType、いくつかの選択肢がありますforkingsimpleなど私が読んで持っているRedHatのドキュメントこのトピック(表9.9)上を、私はどのオプションを使用する必要があるとき、まだ確認していません。

ガイドラインはありますか?

回答:


46

コマンドラインからサービスを手動で開始する場合(nohupプレフィックスコマンドまたは&サフィックスを使用せずにバックグラウンドで実行する、つまり、ファイルのExecStart=行に配置するコマンドを実行するだけ.service)、どうなりますか?

a)サービスが開始して実行を継続し、Control-Cを押すか他の方法でサービスを停止するまでプロンプトが戻らない場合Type = simpleは、正しい選択です。

b)プロンプトが返されても、サービスがバックグラウンドで実行され続ける(つまり、サービスがそれ自体でデーモン化する)場合Type = forkingは、正しい選択です。

c)サービスがジョブを実行し、何も実行せずにプロンプ​​トに戻る場合(つまり、サービスが一部のカーネル設定を調整する、他の何かにコマンドを送信する、または同様のことを行う)、Type = oneshotおそらく正しい選択です。この場合、ExecStartサービスの何かを「設定」するコマンドである可能性がExecStopあり、それを「設定解除」する対応するコマンドになります。このタイプは通常の利点がRemainAfterExit=trueあるため、systemdは、最近の「設定」または「設定解除」に応じて、このサービスの「状態」を追跡します。

他のType値は特別な場合です。たとえば、サービスがD-Bus接続を利用している場合Type = dbus、最適な選択になる可能性があります。それはsystemd事実を認識し、systemdはD-Bus上のこのサービスの存在によってこのサービス(およびそれに依存するもの)を追跡します。

を使用するにType = notifyは、プロセスは環境変数で指定されたUnixソケットに接続し、$NOTIFY_SOCKET必要に応じてそのソケットにメッセージを書き込むことでステータスを報告できる必要があります。また、サービスファイルはNotifyAccess、必要に応じて通知ソケットへのアクセスを許可するオプションを指定する必要があります。

これらのメッセージを送信するために使用できるコマンドラインユーティリティsystemd-notifyとCライブラリ関数sd_notify(3)がありますが、どちらも要件に合わない場合は、独自のメッセージ送信者を実装できます。必要なメッセージは非常に単純で、シェル変数の割り当てのように見えます。たとえば、サービスが正常に起動を完了し、着信要求を処理する準備ができていることを通知するには、サービスはprintf "READY=1\n"ソケットの出力に相当する文字列を送信する必要があります。参照man 3 sd_notify認識メッセージの詳細については。

注:多くのUnixスタイルのシステムに移植できるように設計された多くのサービスアプリケーションは、デフォルトでb)として動作しますが、a)オプション(通常「フォークしない」、「キープランニング」フォアグラウンドで」、「デーモン化しないで」など。その場合、オプションに他の副作用がなければ、オプションを追加し、a)タイプの動作を使用することが望ましいでしょうsystemd


私が開始すると仮定しapache使用すべきタイプ、?
キティガール

2
さて、どのように手動で起動しますか?apachectl startおそらくルートとして実行することで?やってみて、何が起こるか見てみましょう。次に、回答からa)、b)、またはc)を選択します。プロンプトが返され、Apacheが実行されたままなので、b)が答えになると思います。
telcoM

私はあなたが答えで与えた説明が本当に好きです。の場合に別のわかりやすい英語の説明を追加していただけますType=notifyか?
ヤンキー

Type=notify追加の説明。
telcoM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.