確信している。

確信している。

私のプログラム "abc"を起動/停止する2つのメカニズムがあります。

  1. /usr/lib/systemd/system/abc.service の systemctl サービスファイル
  2. /etc/abc init script abc スクリプトはすべてのデーモンを呼び出します。ただし、/etc/abcを使用してデーモンを起動/停止すると、systemctlの状態が正しくありません。

この問題を解決するために、Type = forkingを追加し、PIDFileディレクティブを追加しました。停止する問題を修正しました。 abc init スクリプトを使用してデーモンを停止すると、systemctl 状態が非アクティブとしてマークされます。したがって、この問題は部分的に解決されました。しかし、abc initスクリプトを使用してデーモンを起動すると、まだ非アクティブです。

この問題をどのように解決できますか?ファイルが存在することを確認し、サービスに通知するabc.pathファイルを導入してみました。しかし、これは役に立ちません。

システム219を使用してください。

ベストアンサー1

確信している。

サービス管理サブシステムで開始されていない場合は、サービス管理サブシステムで追跡されません。実際、彼らは真のデーモンにならないでしょう。

rcvan Smoorenburg互換性メカニズムの背景

追加資料: https://unix.stackexchange.com/a/233581/5132

systemdが提供するvan Smoorenburgの互換性メカニズムはrc次のとおりです。発電機。それは以下があることを保証します。作成済み abc.service/etc/init.d/abc startサービスの開始時とサービスの停止時に/etc/init.d/abc stop実行されるサービスです。

この時点で、この存在はsystemdのジェネレータによって生成されるのを完全に防ぎます/usr/lib/systemd/system/abc.serviceabc.service

rcこれはバニラシステムにおけるvan Smoorenburgの互換性の全範囲です。スーパーユーザー機能直接電話する /etc/init.d/abcさまざまな方法でsystemdへの接続を提供します。バニラシステムの強化によりオペレーティングシステムの個々の開発者。

たとえば、Debian と Ubuntu の人々は以下を提供します。フック彼らだけ /lib/lsb/init-functions.d/サブシステムその動作は次のとおりです。

  • フックがinit.dスクリプトが生成されたsystemdサービスのExecStart / ExecStopとして呼び出されていることを検出すると、特別な操作を行わずにスクリプトの残りの部分をそのまま実行します。
  • フックがinit.dスクリプトが直接呼び出されたことを検出した場合いいえ生成されたsystemdサービスの一部として、残りのスクリプトを実行せずにそのサービスに切り替えて切り替えます。 (いくつかの動詞を渡すが、以下の説明のように処理されるとについて話しています。)/etc/init.d/name verbsystemctl verb namestartstop

互換性メカニズムがない場合

すべてのオペレーティングシステムにrc直接呼び出しをsystemdの動作に変換するvan Smoorenburg互換性メカニズムがあるわけではありません。一部のオペレーティングシステム(例:/etc/init.d/name verbArchのインストール中に「init 0」が原因で「超過パラメータ」が表示されるのはなぜですか?rcたとえば、Van Smoorenburgの互換性を提供しません。別の言葉、Debian / Ubuntuなどのフックを提供せず、さらにバニラシステムに付属の互換性メカニズムを完全に無効にします。

これらのオペレーティングシステムでrcvan Smoorenburgスクリプトを直接実行すると、スクリプトはそのまま実行されます。

そのようなスクリプト確かにサービス管理下でサービスを開始します。これはデュアルフォークなどの作業を無駄にし、ほとんどの場合、実際のサービスデーモンが実行されているのと同じ環境で実行しようとします。 (いわゆる「デーモン」と呼ばれるものの多くは機能せず、1980年代以降は動作しませんでした。はログインセッションからコンテンツを分岐しました。

実際、systemdは、直接呼び出されるvan Smoorenburgrcスクリプトとユーザー対話の一部として実行するためにバックグラウンドで生成されるすべての無駄な「デーモン」プログラムを考慮します。セッション範囲ユーザー内彫刻、ユーザーセッションの終了時に実行されるサービスではありませんシステムスライシング

rcさらに悪いことに、van Smoorenburgシステムの非常に欠陥のあるメカニズムを使用することになりました。サービス名と一致するすべてのプロセスを終了します。代わりにガソリンスタンドでただサービスマネージャが起動して追跡している特定のサービスプロセス。それがまさにその理由です。/etc/init.d/name stop現れるあなたのために働きなさい。スクリプトは名前と一致するすべてのプロセスを終了します。これにはService Managerで実行されているプロセスも含まれます。しかし、すべてを無差別に殺すことはバグではありません。これだけ外観適切な機能を備えており、〜する過去数十年の間にあまりにも多くのシステム管理者を尋ねたように、それはあなたを噛むでしょう。

正しいアプローチ

そのような互換性メカニズムが不足している場合rcvan Smoorenburgスクリプトを直接呼び出さないでください。。とても簡単です。serviceorコマンドを使用してsystemctlsystemdのサービス管理と通信しますが、サービスの状態を停止、開始、またはインポートするために直接実行しないでください。/etc/init.d/anything

従属点はまさにあなたですしてはいけないVan Smulenburgの台本が機能するようにするためには、苦しみが/usr/lib/systemd/system/abc.serviceありましたrcType=forkingはいほぼ確実に間違っていたあなたのサービスに。 (ほとんどすべての実際のサービスと一致するわけではありません。)これを提案した人が、誰もが/usr/lib/systemd/system/abc.service実際のサービス管理にまったく必要とされない悪名高い破損したPIDファイルメカニズムから逸脱することができれば実現できます。それを入れ直すのは愚かなことです。

追加読書

おすすめ記事