デーモンと通常の実行プロセスの違いは何ですか?

デーモンと通常の実行プロセスの違いは何ですか?

私はLinuxベースの組み込みシステムでPythonを使用してさまざまなサービスを実装してきました。システムの起動後に永久に実行する必要があるドライバサービスがあります。時間が経つと、他のサービスを子プロセスとして作成し、ループのこの部分を続行します。私が達成したい最も重要なことは、システムがシャットダウンしない限り、このドライバサービスが決して停止しないことです。次のオプションがあります。

  • このサービスをシステムデーモンにして、引き続き実行してください。
  • このサービスを通常のプロセスとして起動し、引き続き実行してください。

どのオプションを選択する必要がありますか、その理由は何ですか?また、この2つのアプローチの根本的な違いは何ですか?

ベストアンサー1

まず質問のタイトルを扱います。デーモンプロセスと通常の実行プロセスの違いは、ほとんどの場合、「通常プロセス」と言うとき、次のユーザー入力/出力APIに接続することを意味します。テキスト端末(通常はファイルディスクリプタテーブルで最初の3つのファイルディスクリプタを開き、それを一種の仮想端末に接続する)またはグラフィカルユーザインタフェース(通常LinuxおよびUNIXではX11プロトコルを使用)。一方、デーモンは通常、端末から分離されているか、そもそも端末に接続されていないプロセスを表します。

問題自体の場合は、デーモンとして実行しても「通常プロセス」として実行しても、アプリケーションがクラッシュして再起動する必要があります。プロセスが一部のユーザー端末に接続されると、ユーザーは障害を検出してアプリケーションを再起動できますが、デーモンは通常この機能が好きではありません。これにより、デーモンが端末から切断された場合、障害の検出がより困難になります。プロセスが中断されました。

この問題を解決するために、サービス管理フレームワークを開発しました。 SysV、SystemD、Upstart、Supervisord、runitなど、さまざまな機能を備えたさまざまな実装があります。彼らはすべて1つの非常に重要な機能を持っています。つまり、デーモンを起動し(通常起動時に自動的に)、失敗するまで監視してから再起動する方法があります。

デバイスドライバサービスを実行するためにサービス管理フレームワークを使用する必要がありますか?必ずこれをしなければなりません。これが唯一合理的なアプローチです。

どのサービス管理ソフトウェアを使用するかは難しい質問です。一般的に最善の方法は、オペレーティングシステムにバンドルされているサービス管理ソフトウェアを使用することです。通常、このソフトウェアはプロセスID 0で実行され、カーネルによって直接起動されます。現在、最新のLinuxベースのオペレーティングシステムで最も顕著なソフトウェアは、豊富な依存関係管理言語、ソケットアクティベーション、タイマー、ネットワーク、ストレージ管理など、多くの機能を提供するSystemDです。 AFAIK、組み込みLinuxオペレーティングシステムではこれはあまり一般的ではなく、組み込みシステムはおそらく失敗したサービスを再起動するのにあまり良くないクラシックSysVを使用します(またはまったく実行しないことが多いです)。 SysVベースのオペレーティングシステムの場合、多くの管理者はSysVサービスフレームワークを使用して他のサービスマネージャ(SupervisordやRunitなど)を起動し、サービスを管理できるようにします。を好む。

おすすめ記事