27

同一のハードウェアとソフトウェアを実行している約40台のコンピューターがあります。それらはすべてUbuntu11.10を実行します。それらはすべて、ログインするための1つのユーザーアカウントしか持っていません。.profileファイルは、デーモンプロセスを起動するように設定されています。デーモンのコードはCで書かれています。

数週間に1回、デーモンが実行されなくなったというレポートが表示されます。これはすべてのコンピューターで発生するわけではなく、1台または2台で発生します。問題を一貫して再現することはできません。

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

私が理解しているように、SIGHUPはユーザーがログオフしたときに生成されます。この場合、ユーザーがログオフすることはありません。他の理由でSIGHUPが生成された可能性があるのではないかと思います。他の考えをいただければ幸いです。

4

2 に答える 2

27

さて、SIGHUPについて注意すべきことがいくつかあります。第一に、その起源は、ハングアップの概念、つまりモデムのようなものを介したコンソールへの接続の喪失にあります。現代の用語では、これは一般的にそれがその制御ttyを失ったことを意味します。ttyから切り離すように注意していない限り、特定の端末で開始されたプログラムは、端末が閉じられたときにSIGHUPを受け取ります。プログラムでこれを行う方法の詳細については、ここを参照してください。その他のオプションは次のとおりです。

  • 内部でプログラムを実行する、screenまたはtmux
  • nohupまたは他のデーモン化フレームワークを使用してプログラムを実行する

もう1つの可能性は、プロセスにSIGHUPを意図的に送信していることです。これは、「従来」によって、構成を再読み取りする必要があることをプロセスに通知するためによく使用されます。

于 2012-11-12T12:26:47.100 に答える
16

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

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

このコマンドがUbuntuにインストールされていない場合は、を実行してsudo apt-get install daemonくださいman daemon

于 2012-11-12T03:09:53.010 に答える