特定のアプリケーションが使用するシステムサービスの種類を決定する方法

特定のアプリケーションが使用するシステムサービスの種類を決定する方法

Typesimple私はsystemdが設定できるさまざまなサービス(例:oneshotなど)を比較的よく扱っていると思います。

これ文書オプションのかなり合理的な概要と説明があります。最善の選択を「推測」し、「試行錯誤」を通じてこれを確認することが可能な場合が多いです。これは特に私にとって非常に使いやすいアプリケーションに当てはまります。

しかし、「試行錯誤」テスト中に私が考慮していない状況(例えば、極端なエラーの危険性)が発生する可能性があることが心配されます。だから私はどちらが最善かを判断するためにアプリケーションをテスト/調査する方法についてのアドバイスを探していますType

FWIWは、アプリケーションを手動で起動し、ブランチの有無(複数のプロセスなど)に関係なく、アプリケーションがどのように応答するかを追跡する方法を考えています。私が見逃したこれを行うには、比較的簡単な方法(標準のコマンドラインツールを使用)が必要です。

関連性があるかどうかはわかりませんが、Debianが私が選択したディストリビューションです。

ベストアンサー1

(からコピーSuper User.SEへの私の答えです。)

コマンドラインから手動でサービスを開始するとどうなりますか(nohupプレフィックスコマンドやサフィックスを使用せずにバックグラウンドで実行する、&つまりExecStart=ファイル行に入力したコマンドのみを実行します)。.service

ㅏ)サービスが開始され、引き続き実行され、Ctrl-Cを押すかサービスを停止するまでプロンプトが返されない場合は、Type = simple正しい選択です。

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

氏)サービスがタスクを完了し、実行中のアイテムをそのままプロンプトに戻す(たとえば、サービスがいくつかのカーネル設定を調整したり、他のアイテムにコマンドを送信したり、同様のタスクを実行したりした場合など)、正しい選択である可能性がType = oneshotあります。この場合、ExecStart提供されるものは、何かを「設定」するコマンドであってもよいし、それをExecStop「設定解除」する対応するコマンドであってもよい。このタイプは通常の利点を利用するため、RemainAfterExit=truesystemdは最近アイテムが「設定」されているか「設定解除されている」かによってサービスの「状態」を追跡します。

他のType値は特別なケースです。たとえば、サービスが D-Bus 接続を使用している場合、これがType = dbus最良の選択肢となります。これを知っていると、systemdsystemdは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)タイプの動作を使用することをお勧めしますsystemd

おすすめ記事