systemdで管理したいサービスがあります。これをと呼びますfoo
。ユニットファイルを作成しましたが、うまくいきます。したがって、を実行するとsystemctl start foo
サービスが正しく開始され、を使用してステータスを表示できますsystemctl status foo
。
ただし、外部プログラムもサービスを開始でき、サービスを開始するために systemd を使用しません。したがって、サービスは実行できますが、systemdを介して開始されなかったため、systemdはこれを知りません。この場合、systemctl status foo
サービスが正常に実行されているにもかかわらず、サービス障害が報告されます。
systemctl status foo
systemdがサービスを開始しなくても、サービスが実行中であることを正しく報告するように、systemdがこのサービスを「継承」または「採用」する方法はありますか? SysVを使用すると、小さな「状態」スクリプトを書くことができますが、/etc/init.d/foo status
システムモデルには合わないようです。
明らかに、外部プログラムがサービスを開始しても、サービスプロセスはPID 1 / systemdのサブプロセスです。ただし、foo
systemdはそれを開始して登録しないため、これをサービスの一部として認識しません。
具体的な技術は次のとおりです。
- Oracle WebLogic(このサービスはホストされたWebLogicインスタンスです。)
- Oracle NodeManager(サービスを開始できる外部プログラム)
- システム 219
答え1
習慣。 systemdに関する限り、プロセスは別のコンテキストで実行されます。
実際、これはデスクトップバスサービスのアクティブ化を避けるべき理由の1つです。 systemdに関する限り、デスクトップバスエージェントによって直接作成されたサービスプロセスはそのサービスの一部です。
人々は、適切な権限で制御グループ間でプロセスを移動できます。しかし、これは作業の半分に過ぎず、残りの半分は、systemdがユニットが起動しなかったときにユニットを起動したと信じさせ、内部データ構造を再構築するために必要な部分を提供しません。
これはsystemdのモデルではなく、ほとんどのサービス管理サブシステムのモデルではありません。
しかし、あまりにも多くの人がOracleソフトウェアを「まともな」サービス単位として考えていますが、実際にはそうではありません。恐怖の家地域。
追加読書
- systemctl以外のメカニズムでデーモンが起動した場合、systemctlはデーモンの状態を正確に報告できません。
- systemdを使用したJavaデーモンの構成
- https://unix.stackexchange.com/a/437461/5132
- ジョナサンデボインポラード(2016)。デスクトップバス(D-Bus)バスの起動を防止 。何かを食べる。ソフトウェア。
- ジョナサンデボインポラード(2015)。 システム化された恐怖の家。よく与えられる答えです。
答え2
簡単に言えば、systemd自体でサービスを開始しない限り、systemdにサービスの起動を考慮させる方法はありません。 systemdのポイントの1つはサービスを一貫して管理することであり、サービスを開始するさまざまな方法を持つことはそのアイデアに反します。
今システムする外部から開始されたプロセスを管理するための条項がありますが、これはあなたが説明する状況にある程度適しているようです。これは実際には別々の単位です。範囲単位。
スコープ単位を使用するには、依然として systemd との外部システム対話が必要です。範囲単位は systemd への D-Bus 要求でのみ開始でき、範囲の初期プロセスとして使用する PID を渡すことができるためです。また、スコープ単位を起動すると、systemdはまだcgroup自体を生成すると予想します(その後、渡されたPIDを生成されたcgroupに移動します)。したがって、systemdでこれらのプロセスを管理するには、新しいプロセスをスコープとして作成するアプリケーションのサポートが必要です。
つまり、サービスを開始するために2つの異なる方法を使用しないでください。必要な場合にのみサードパーティのサービスマネージャを使用してください。
解決する問題が起動中にサービスを開始することである場合は、次の手順を実行します。
サードパーティの管理者(あなたのOracle NodeManager)が起動時にサービス構成をサポートしていることを確認してください。サービスを管理するため、起動時にもサービスを管理する必要があります。
systemdを使用している場合は、単純な
oneshot
サービスユニットを使用してサードパーティの管理者にサービスの開始を依頼してください。これは、一部のAPIまたはRPC(おそらくHTTP経由)を介してサードパーティの管理者(あなたのOracle NodeManager)に連絡し、サービスを開始するように指示することを意味します。
起動にsystemdを使用している場合は、デバイス名を適切に指定します(たとえば、「start-foo」、「initial-foo」、または「foo-startup」)、「起動」状態のままではなく(デフォルト)状態のoneshot
ままなることを明確にします。値)なので、デバイスの状態を確認すると正常に完了したことだけが表示されるため、サードパーティの管理者で実行されているサービスの状態を反映すると混乱することはありません。RemainAfterExit=
no