文書のさまざまな用語によると、「アクティブ」状態は、非アクティブ状態とアクティブ状態の間の遷移です。これまでは明らかです。
しかし、それはどのように定義されていますか?
サービスが非アクティブでなくアクティブになっているかどうかはどのように決定されますか?
サービスがもはやアクティブではなく、アクティブになったかどうかはどのように決定されますか?
私が知っている唯一の「アクティブ」状態は、スクリプトがExecStartPre
実行されたときにサービスが「アクティブ」状態を維持することです。
サービスをアクティブに保つ他の方法はありますか?
サービスに基本サービスを開始させることができますが、実行可能ファイルが特定のExecStart
「起こりました!」を生成する場合にのみアクティブと見なすことができます。イベントみたいなんですか?
答え1
実行中、サービスは「アクティブ」のままです。
これは、無効なサービスファイルを使用していることを示しますType=
。どのサービスがいつ開始されるかについては、man systemd.unit
およびをご覧ください。systemd.service
ここにコピーして貼り付けるにはテキストが長すぎますが、次のType=
説明に従ってくださいman systemd.service
。
Type=
サービスの開始が完了したことをサービスが管理者に通知するメカニズムを構成します。シンプル、実行、ブランチ、ワンショット、dbus、通知、通知 - リロードまたはアイドルのいずれか:
- (デフォルトが指定されているが両方が指定されていない
simple
場合)に設定されている場合、サービス管理者は、デフォルトのサービスプロセスが分岐した後(つまり、さまざまなプロセスプロパティを設定した後に移行が移行)、新しいプロセスがすぐに開始されると見なします。実際のサービスバイナリを呼び出すために呼び出されました)。多くの場合、これはより良いオプションです。以下を参照してください。ExecStart=
Type=
BusName=
fork()
execve()
Type=exec
- タイプ
exec
は単純に似ていますが、サービスマネージャはデフォルトのサービスバイナリが実行された直後にそのユニットが開始されると見なします。 [...]- に設定すると、
forking
管理者は管理者が分岐したバイナリが終了した直後にデバイスが起動すると見なします。このタイプの使用はお勧めできませんnotify
。代わりにnotify-reload
、またはdbus
[...]を使用してください。- 動作
oneshot
は同様ですsimple
が、サービス管理者は基本プロセスが終了した後にデバイスを考慮します。 [… ][...そしてバス/通知ベースのシステム...]
したがって、サービスが「アクティブ化」から「アクティブ」に切り替わるポイントは、設定方法によって異なります。しかし、「アクティブ化」は常に同じポイント、すなわちシステムがサービスファイルで指定されたタスクを実行し始める瞬間から始まる。