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

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

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

答え1

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

検索を実行するか、次のものを探します。https://serverfault.com/questions/204695/compressive-guide-to-init-d-scripts

答え2

xinetdネットワークデーモンを作成すると仮定すると、最も簡単な方法は/に接続し、inetdデーモンをxinetd/ツールに委ねるCプログラムを作成することですinetd

答え3

ユーザーが常に実行したくなく、必要なときにのみ実行したいネットワークサービスをリッスンするために何かを作成したい場合は、inetd / xinetdで実行して正しいポートに接続する方が良いでしょう。そしてそのように実行します。

init.dは、さまざまな* NIXの「サービス」としても知られており、さまざまな実行レベルで実行されるように設計されたサービスを実行するために使用されます。になります。など。)。これらのサービスは、アクセスの有無(データベースなど)に関係なく、継続的に実行するように設計されています。

たとえば、データベースは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実行レベルを使用して「サービス」として実行するには、その機能を実行するプログラムを作成してから、stopパラメータとstopパラメータをサポートするスクリプトを作成する必要があります。その後、スクリプトを/etc/init.d/に配置できます。次に、適切な実行レベルディレクトリ(rc3.dなど)のスクリプトを指すシンボリックリンクを作成し、開始シンボリックリンクは大文字の「S」で始まります。これはアクティブで、起動時に開始する必要があることを意味し、その後に次の数字が続きます。そのランレベルで他のものより前に実行するには「01」、そのランレベルAで最後に実行するには「01」の数字「99」です。これが重要な理由は、他のサービス(DNS、NFS、ネットワーキングなど)に依存するサービスが利用できないときにサービスを開始したくないからです。これらのプロセスの開始後に番号を提供する必要があるかもしれません。システムがスクリプトS99domythingを呼び出すと、「start」という単語をパラメータ#1に渡し、スクリプト内に「start」が選択されたときにプロセスを開始するスイッチケースが必要です。スクリプトを無効にして削除したくない場合は、小文字の「s」で始まるように名前を変更してください(例:「s99domything」)。

同様に、プロセスを順番に終了するには、/etc/init.d/domythingスクリプトへのシンボリックリンクの前に「K」を入れることができます(例:K01domything)。別のプロセスの後にスクリプトを開始する必要がある場合は、そのスクリプトを終了するには、他のプロセスの前に終了する必要があります。したがって、スタートアップが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」かによって「start」または「start」を渡します。止まる」。

これは、ほとんどすべての* NIXの特徴の微妙な変化と一致するいくつかの点を説明するのに役立つことを願っています。

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

乾杯!

関連情報