C プログラムをデーモンとして実行するにはどうすればよいですか?

C プログラムをデーモンとして実行するにはどうすればよいですか?

デーモンとして実行したい C プログラムがあります。Ubuntu 14.04LTS で作業しています。正しい方法は何でしょうか? どなたか助けていただけませんか?

答え1

さて、Ubuntu の答えです。

これを行う正しい方法は、Ubuntu 14に付属するデーモンマネージャを使用することです。ここで他の人が言っているように、プログラムを明示的にデーモンとして設計し、daemon()ライブラリ関数を呼び出すことは完全に間違っています。皮肉なことに、Ubuntuには3つのLTSリリースでアップスタートがありました。バージョン 14 LTS まで — 実際には 2006 年の Ubuntu 6.10 以降です。それ以来、何らかの形でデーモン マネージャーが存在しています。

適切なサービス管理を行う人々にとっての正しい答えは、しないでください電話daemon()してあなたしないでください「デーモンになる」には特別な手順を踏む必要があります。そして、一部の人にとっては、1990 年代初頭からこれが正しい答えでした。2006 年でさえ、パーティーにはやや遅れていました。☺ それでも、Ubuntu に関しては、過去 10 年間、これが間違いなく正しい答えでした。

やることは簡単です。upstartにいつどのようにプログラムを呼び出すかを伝えるupstartの「ジョブ」ファイルを設定します。upstartはそれを呼び出します。すでに悪魔化されている制御端末を持たず、予測可能で不変の初期プロセス状態を持つプログラム何も特別なことはしないそして、通常の方法でログとエラー メッセージを標準エラーに書き込んで実行します。ジョブ ファイルで、upstart が標準エラーに書き込まれた内容をどのように処理するかを指定します。

アップスタートクックブック起動イベントやログ処理を制御するさまざまなスタンザを含め、これらすべてについて詳しく説明しています。また、このテーマについては、ここや AskUbuntu にたくさんあります。

Ubuntu 16 LTSにアップグレードすると、世界がかなり大きく変わることを覚悟してください。しかし、それでもコード内では何も特別なことはせず、デーモンマネージャーの下で実行するだけです正しい答えのままになります。

参考文献

答え2

プログラムをターミナルから実行する必要がある場合は、次の方法があります (プログラムはユーザー入力を求めてはいけません)。

  • nohup: を 使用しますnohup program > program.log 2>program.err &。その後、ターミナルを終了できます。

  • サービスの使用 atd:echo "program > program.log 2>program.err" | at now
    または echo "program > program.log 2>program.err" | batch

  • ブート スクリプトによってサービスとして実行されます。

プログラムがユーザー入力を求めている場合、ターミナルの外部で実行することはできません。最善の方法は、screenまたはtuxセッションを使用して、 をターミナルから切り離すことです。

関連情報