Type
simple
私はsystemdが設定できるさまざまなサービス(例:oneshot
など)を比較的よく扱っていると思います。
これ文書オプションのかなり合理的な概要と説明があります。最善の選択を「推測」し、「試行錯誤」を通じてこれを確認することが可能な場合が多いです。これは特に私にとって非常に使いやすいアプリケーションに当てはまります。
しかし、「試行錯誤」テスト中に私が考慮していない状況(例えば、極端なエラーの危険性)が発生する可能性があることが心配されます。だから私はどちらが最善かを判断するためにアプリケーションをテスト/調査する方法についてのアドバイスを探していますType
。
FWIWは、アプリケーションを手動で起動し、ブランチの有無(複数のプロセスなど)に関係なく、アプリケーションがどのように応答するかを追跡する方法を考えています。私が見逃したこれを行うには、比較的簡単な方法(標準のコマンドラインツールを使用)が必要です。
関連性があるかどうかはわかりませんが、Debianが私が選択したディストリビューションです。
答え1
(からコピーSuper User.SEへの私の答えです。)
コマンドラインから手動でサービスを開始するとどうなりますか(nohup
プレフィックスコマンドやサフィックスを使用せずにバックグラウンドで実行する、&
つまりExecStart=
ファイル行に入力したコマンドのみを実行します)。.service
ㅏ)サービスが開始され、引き続き実行され、Ctrl-Cを押すかサービスを停止するまでプロンプトが返されない場合は、Type = simple
正しい選択です。
雨)プロンプトが返されたがサービスがバックグラウンドで実行され続ける場合(つまり、サービスが独自にデーモン化される場合)、これはType = forking
正しい選択です。
氏)サービスがタスクを完了し、実行中のアイテムをそのままプロンプトに戻す(たとえば、サービスがいくつかのカーネル設定を調整したり、他のアイテムにコマンドを送信したり、同様のタスクを実行したりした場合など)、正しい選択である可能性が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)タイプの動作を使用することをお勧めしますsystemd
。