私のプログラム "abc"を起動/停止する2つのメカニズムがあります。
- /usr/lib/systemd/system/abc.service の systemctl サービスファイル
- /etc/abc init script abc スクリプトはすべてのデーモンを呼び出します。ただし、/etc/abcを使用してデーモンを起動/停止すると、systemctlの状態が正しくありません。
この問題を解決するために、Type = forkingを追加し、PIDFileディレクティブを追加しました。停止する問題を修正しました。 abc init スクリプトを使用してデーモンを停止すると、systemctl 状態が非アクティブとしてマークされます。したがって、この問題は部分的に解決されました。しかし、abc initスクリプトを使用してデーモンを起動すると、まだ非アクティブです。
この問題をどのように解決できますか?ファイルが存在することを確認し、サービスに通知するabc.pathファイルを導入してみました。しかし、これは役に立ちません。
システム219を使用してください。
ベストアンサー1
確信している。
サービス管理サブシステムで開始されていない場合は、サービス管理サブシステムで追跡されません。実際、彼らは真のデーモンにならないでしょう。
rc
van 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.service
。abc.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 verb
systemctl verb name
start
stop
互換性メカニズムがない場合
すべてのオペレーティングシステムにrc
直接呼び出しをsystemdの動作に変換するvan Smoorenburg互換性メカニズムがあるわけではありません。一部のオペレーティングシステム(例:/etc/init.d/name verb
Archのインストール中に「init 0」が原因で「超過パラメータ」が表示されるのはなぜですか?rc
たとえば、Van Smoorenburgの互換性を提供しません。別の言葉、Debian / Ubuntuなどのフックを提供せず、さらにバニラシステムに付属の互換性メカニズムを完全に無効にします。
これらのオペレーティングシステムでrc
van Smoorenburgスクリプトを直接実行すると、スクリプトはそのまま実行されます。
そのようなスクリプト確かにサービス管理下でサービスを開始します。これはデュアルフォークなどの作業を無駄にし、ほとんどの場合、実際のサービスデーモンが実行されているのと同じ環境で実行しようとします。 (いわゆる「デーモン」と呼ばれるものの多くは機能せず、1980年代以降は動作しませんでした。はログインセッションからコンテンツを分岐しました。
実際、systemdは、直接呼び出されるvan Smoorenburgrc
スクリプトとユーザー対話の一部として実行するためにバックグラウンドで生成されるすべての無駄な「デーモン」プログラムを考慮します。セッション範囲ユーザー内彫刻、ユーザーセッションの終了時に実行されるサービスではありませんシステムスライシング。
rc
さらに悪いことに、van Smoorenburgシステムの非常に欠陥のあるメカニズムを使用することになりました。サービス名と一致するすべてのプロセスを終了します。代わりにガソリンスタンドでただサービスマネージャが起動して追跡している特定のサービスプロセス。それがまさにその理由です。/etc/init.d/name stop
現れるあなたのために働きなさい。スクリプトは名前と一致するすべてのプロセスを終了します。これにはService Managerで実行されているプロセスも含まれます。しかし、すべてを無差別に殺すことはバグではありません。これだけ外観適切な機能を備えており、〜する過去数十年の間にあまりにも多くのシステム管理者を尋ねたように、それはあなたを噛むでしょう。
正しいアプローチ
そのような互換性メカニズムが不足している場合rc
van Smoorenburgスクリプトを直接呼び出さないでください。。とても簡単です。service
orコマンドを使用してsystemctl
systemdのサービス管理と通信しますが、サービスの状態を停止、開始、またはインポートするために直接実行しないでください。/etc/init.d/anything
従属点はまさにあなたですしてはいけないVan Smulenburgの台本が機能するようにするためには、苦しみが/usr/lib/systemd/system/abc.service
ありましたrc
。 Type=forking
はいほぼ確実に間違っていたあなたのサービスに。 (ほとんどすべての実際のサービスと一致するわけではありません。)これを提案した人が、誰もが/usr/lib/systemd/system/abc.service
実際のサービス管理にまったく必要とされない悪名高い破損したPIDファイルメカニズムから逸脱することができれば実現できます。それを入れ直すのは愚かなことです。
追加読書
- ジョナサンデボインポラード(2015)。Unixデーモンの準備プロトコルの問題。よく与えられる答えです。
- ジョナサンデボインポラード(2015)。「継承と悪魔の誤り」。"service"コマンドに問題はありません。。何かを食べる。 JdeBPソフトウェア。
- ジョナサン・ドボイン・ポラード(2001)。 Unixデーモンを設計する際に避けるべき間違い。一般的な答え。
- https://unix.stackexchange.com/a/200365/5132
- systemdはサービスが停止したかどうかを判断しますか?
- サービス対systemctlスクリプト - 使用するスクリプト