web-dev-qa-db-ja.com

Cプログラムをデーモンとして実行する方法は?

デーモンとして実行したいCプログラムがあります。 CentOSでデーモンとして実行されるようにインストールするにはどうすればよいですか? @rebootを使用すると言う人もいれば、/etc/rc.d/rc.localに入れると言う人もいます。どちらが正しい方法ですか?

6
newbie14

どちらでもない。実際のデーモンのように適切に動作させたい場合は、initシステムを使用して配置する必要があります-/etc/init.d(そして適切なランレベルリンクを適切な/etc/rc.Xフォルダーに作成します)

検索を実行するか、次のようなものを見てください: https://serverfault.com/questions/204695/comprehensive-guide-to-init-d-scripts

7
thinice

ネットワークデーモンを作成していると仮定すると、最も簡単な方法は、xinetd/inetdにインターフェイスするCプログラムを作成し、デーモンをxinetdに任せることです。/inetdツール。

1
sybreon

ユーザーが、常に実行したくないネットワークサービスをリッスンするために何かを書きたいが、必要な場合にのみ、inetd/xinetdで実行するのがおそらく最善であり、適切なポートに関連付けて実行します。そのように。

* NIXのさまざまなフレーバーで「サービス」とも呼ばれるinit.dは、さまざまな実行レベル(起動、シャットダウン、シングルユーザー、マルチユーザー、ネットワーク付きなど)で動作することを目的としたプログラムを実行するためのものです。なし、グラフィックインターフェイス付きなど)。これらのサービスは、アクセスされているかどうかに関係なく(データベースなど)継続的に実行することを目的としています。

たとえば、データベースはinit.d/services/systemctlで開始/停止されるため、マルチユーザー+ネットワークの起動時にデータベースを起動するスクリプトがあり、対応するスクリプトがあり、データベースを適切にシャットダウンします。ネットワークが遮断される前のシャットダウンプロセス。これらのスクリプトは/etc/init.d/に配置され、正しいランレベル(/etc/init.d/rc2.d = runlevel2、rc3.d = runlevel 3など)にシンボリックリンクされます。 「/ etc/inittab」ファイルを確認することで、考えられるさまざまな実行レベルを特定できます。 * NIXのフレーバーに応じて、「runlevel」または「uptime」と入力すると、現在のランレベルを確認できます。データベースは、ネットワークまたはローカルから誰も接続されていない場合でも実行されます。

ただし、telnetデーモン、fingerデーモン、whoisデーモンなど、OSの動作とより密接に関連している小さなものがあり、常にメモリに保存したくない場合は、必要な場合にのみ実行します。 inetd/xinetd。基本的にinetd/xinetdは「スーパーサーバー」であり、特定のポートで特定のタイプの接続を検出すると、デーモンを起動してそのメッセージを処理し、別のポートで再生成し、完了したら終了します。このようにして、利用可能なシステムリソースに基づいて接続を処理するために、数百、数千のプロセスを生成できます。

Cプログラムをinit実行レベルで「サービス」として実行する場合は、その機能を実行するプログラムを作成し、次に停止引数と停止引数をサポートするスクリプトを作成します。次に、そのスクリプトを/etc/init.d/に配置します。次に、適切なランレベルディレクトリ(rc3.dなど)でそのスクリプトへのシンボリックリンクを作成します。起動用のシンボリックリンクは大文字の「S」で始まります。これは、両方がアクティブであり、開始時に実行する必要があることを意味します。そのランレベルで他の何よりも先に実行したい場合は「01」、そのランレベルで最後に実行したい場合は「99」などの番号がすぐに続きます。これが重要な理由は、DNS、NFS、さらにはネットワークなどの別のサービスに依存するサービスを開始したくないためです。これらのプロセスが開始された後、番号を付けたいと思うでしょう。システムがスクリプトS99domythingを呼び出すと、引数#1として「start」という単語が渡されます。スクリプト内には、「start」を選択するとプロセスが起動するスイッチケースが必要です。スクリプトを無効にしたいが削除したくない場合は、小文字の「s」で始まるように名前を変更します(例:「s99domything」)。

同様に、プロセスを正常にシャットダウンするには、K01domythingなどの/etc/init.d/domythingスクリプトへのシンボリックリンクの前に「K」を付けます。さて、スクリプトを他のプロセスの後に開始する必要がある場合、スクリプトをシャットダウンしたいときは、おそらく他のプロセスの前にシャットダウンする必要があります。したがって、スタートアップがS99domythingの場合、シャットダウンはK01domythingである可能性があります。また、initプロセスがKで始まるスクリプトを見つけると、スクリプトを呼び出すときに最初の引数を「stop」として送信します。スクリプトには、サービスを適切にシャットダウンする「停止」ケースを含める必要があります。

かなり賢い。

これは、/ sbin/shutdownを使用することが重要である理由でもあります。これにより、initが適切な起動/シャットダウンシーケンスを実行し、すべてが「整然とした」方法で処理され、データの損失や破損が減少します。

いくつかの例:

/etc/rc3.d/S25mysql is a symlink to /etc/init.d/mysql.sh
/etc/rc5.d/K01mysql is a symlink to /etc/init.d/mysql.sh

どちらの場合も、シンボリックリンクは同じ/etc/init.dファイルを指しますが、initプロセスがシンボリックリンクを起動すると、最初の文字が「S」か「K」かによって「開始」または「停止」が渡されます。 。

これが、* NIXのほぼすべてのフレーバーにわたるマイナーなバリエーションと一致するいくつかのことを説明するのに役立つことを願っています。

* NIXの最新バージョンでは、systemctl/servicesを使用する代わりに、inetd/xinetdが使用できなくなりました。それは場所があり、信頼性が高く、使いやすいので、それは残念です。/etc/servicesを見ると、何年にもわたってさまざまなポートがすべて割り当てられていたことがわかります。ポート1024以下は、ルート所有のプロセスによって処理される必要があります。

乾杯! -D

0
TekOps