2012-11-12 12 views
9

私たちには、同じハードウェアとソフトウェアを実行する約40台のコンピュータがあります。それらはすべてUbuntu 11.10を実行します。それらはすべてログインするユーザーアカウントが1つしかありません。.profileファイルはデーモンプロセスを起動するように設定されています。デーモンのコードはC言語で書かれています。SIGHUPが生成される原因は何ですか?

数週間後、デーモンがもう動作していないというレポートが表示されます。これはすべてのコンピュータではなく、1つまたは2つだけです。問題を一貫して再現することはできません。

コードを見ると、アプリケーションはSIGHUPまたはSIGTERMのいずれかを受信すると終了します。

私が理解するように、ユーザーがログオフするとSIGHUPが生成されます。私たちの場合、ユーザーは決してログオフしません。私はSIGHUPが他の何らかの理由で生成された可能性があるかどうか疑問に思っています。他の考えがあれば分かるはずです。

+0

デーモンにログを記録して、2つの信号のいずれが原因であるかを確認しましたか? SIGHUPは、制御端末が閉じている場合に起動されるようですが、サーバービルドを使用していて1つの主な接続のみを使用している場合は、違いがあります。 –

+0

信号を手動で送信することもできます。知るか? – arkascha

答えて

7

killユーティリティまたはkill syscallを使用して信号を送信できます。 もちろん、誰がその信号を送信しているのか、端末やネットワーク接続を切断しているかを調べることができますが、問題を解決するためのより簡単な方法があります。

コードがデーモンとして実行されることになっていても、実際にはあなたのものと同じではない場合は、プログラムをデーモンにするラッパーがあります。サプライズ - このラッパーはdaemonと呼ばれています!何らかの理由で死んでも、ユーティリティを自動的に再起動するオプションは、おそらく最も重要な選択肢がたくさんあります。

このコマンドがあなたのUbuntuにインストールされていない場合は、開始するにはsudo apt-get install daemonman daemonと入力してください。

+1

であり、 'daemon(3)'ライブラリ関数もあります。 –

+0

ありがとうございました。コードは、デーモンとして実行するように書かれています(fork、setsidなどを使用)。しかし、私は外部デーモンツールも見ていきます。 – Peter

11

まあ、SIGHUPについては注意すべきことがいくつかあります。まずは、ハングアップという概念から始まります。つまり、モデムのようなものを介してコンソールに接続できなくなります。現代の言い回しでは、これは一般的にそれが制御されているttyを失っていることを意味します。指定された端末で起動されたプログラムは、端末が閉じられたときにSIGHUPを受信します。プログラムでこれを行う方法の詳細については、hereを参照してください。その他のオプションが含まれます:

  • 「「スクリーン」」の内側にあなたのプログラムを実行しているか、「」tmuxは「」
  • は他の「」nohupは「」や他のいくつかのdaemonisingフレームワーク

を使用してプログラムを実行します可能なことは意図的にあなたのプロセスを送信しているということです。SIGHUPは "伝統"であり、しばしばそれが設定を読み返すべきであることを伝えるために使われます。

関連する問題