systemdはデュアルフォークデーモンを処理できますか?
前に使った初期化.d/デーモンを管理するために書いたスクリプトは、長年にわたって完全に機能してきました。今私はシステム/スクリプトを実行しましたが、デーモン設定コードを実行する方法で動作させることはできません。
デーモンを設定するときに制御端末を解放し、セッションリーダーになるのを防ぐために2回フォークします。
問題は、あなたがそうしたときに私が確認したことですシステム/トレースを失い、デーモンを殺します。また、2番目のフォークをスキップすると再び機能することも確認しました。システム/。
私の基本(議論の目的で少し単純化された)systemd / scriptは次のとおりです。
[Unit]
Description=GM7 Service Daemon
[Service]
Type=forking
ExecStart=/usr/bin/g7ctrl
[Install]
WantedBy=multi-user.target
だから私の質問は次のとおりです。過去10年間でC / C ++でデーモン設定コードがどのように実行されたかを変更する必要がありますか、それともシステム化/追跡デュアルフォークを持つオプションがありますか?
まだ内部の仕組みを完全に理解していません。 systemd自体が起動するすべてのデーモンに対してプロセスを作成すると、デュアルフォークは実際に役に立たなくなります。
私は私がやった方法(二重交差)が部分的に歴史的な理由のためであることを認めます。しかし、当時のベストプラクティスについてかなり深く読み、これが後で(約10年前)思い出したのです。
ベストアンサー1
過去10年間でC / C ++でデーモン設定コードがどのように実行されたかを変更する必要がありますか?
はい。
約10年前だけでも、これは正しいアプローチではありませんでした。 1990年代初頭から、AIXシステム・リソース・コントローラーに問題がありました。 daemontoolsユーザーは1990年代後半からそれに反対してきました。 2006年に主流のLinuxオペレーティングシステムに採用されたUpstartには適していません。inittab
1980年代初頭にAT&T System 5 Release 3を実行するのには適していません。
systemdには適していません。人々はこのタイプについて話すかもしれませんが、forking
しばしばそれがタイプであるという事実を忘れたり、さらには知りません。特定特定の方法で完了するデュアルフォークによるサービス準備プロトコル。さらに悪いことに、プロトコルを正しく表現するために必要な方法は、あなたや他の人がC / C ++プログラムを書く方法とうまく合わないということです。
このトピックに対する私の共通の答えは、2008年に約4分の3程度続きました。
IBMは1995年以来、Redbookでこの内容を述べました。
システムの観点から、新しい人がシステムマニュアルで同じことを言いましたが、わずか8年ほどになりました。 ☺
サービス管理サブシステムにすべてを処理させます。あなたのプログラムはすでに実行が開始されると、デーモンコンテキストで実行されます。
デーモンエラーに依存しているすべてのコードを本当に保存したい場合は、少なくとも過去20年間に他の多くの人がやったことをし(一部のdaemontoolsの人々に対応して)、世界にコマンドを発行します - 行オプションすべて消して。ただし、このコマンドラインオプションがデバッグスイッチとして機能するようにしないでください。
追加読書
- ジョナサン・ドボイン・ポラード(2001)。 Unixデーモンを設計する際に避けるべき間違い。よく与えられる答えです。
- ジョナサンデボインポラード(2015)。実際にデーモンは必要ありません。本当。。体系化された恐怖の家。
- ジョナサンデボインポラード(2015)。Unixデーモンの準備プロトコルの問題。一般的な答え。
- https://unix.stackexchange.com/a/401611/5132