39

ウォッチドッグアプリケーションがあります。何らかの理由でクラッシュする可能性のあるメインアプリを監視します(悪いことはわかっていますが、これは重要ではありません)。

このウォッチドッグをプログラムして、SIGUSR1信号を受け入れ、アプリケーションの存在の監視を停止しました。私はそれを合図します

kill -SIGUSR1 `pidof myapp`

これは本当にうまくいきます。この機能が組み込まれていない古いバージョンのウォッチドッグにシグナルを送信しようとすると、問題が発生します。この場合、killシグナルはウォッチドッグを強制終了し(プロセスを終了し)、さらに複雑になります(デバイスの再起動)。 。

この特定のシグナルが処理されない場合にウォッチドッグが終了しないように、SIGUSR1でウォッチドッグにシグナルを送る方法はありますか?

4

2 に答える 2

38

信号処理に関するGNUドキュメントから:

SIGUSR1およびSIGUSR2信号は、任意の方法で使用できるように確保されています。これらは、シグナルを受信するプログラムでシグナルハンドラーを作成する場合に、単純なプロセス間通信に役立ちます。「別のプロセスのシグナリング」セクションに、SIGUSR1とSIGUSR2の使用法を示す例があります。 デフォルトのアクションは、プロセスを終了することです。

SIGINFOのデフォルトのアクションは何もしないことなので、より適切な場合があります。

SIGINFO:情報リクエスト。4.4 BSDおよびGNUシステムでは、ユーザーが標準モードでSTATUS文字を入力すると、この信号は制御端末のフォアグラウンドプロセスグループ内のすべてのプロセスに送信されます。信号の原因となる文字のセクションを参照してください。プロセスがプロセスグループのリーダーである場合、デフォルトのアクションは、システムとプロセスが実行していることに関するステータス情報を出力することです。それ以外の場合、デフォルトでは何もしません

SIGHUPは、制御端末が閉じられたときに発行されますが、ほとんどのデーモンは端末に接続されていないため、「リロード」として使用することは珍しくありません。

デーモンプログラムは、SIGHUPをシグナルとして使用して、自身を再起動することがあります。これの最も一般的な理由は、変更された構成ファイルを再読み取りすることです。

ところで、ウォッチドッグは、プロセスを再起動する必要があるかどうかを知るために、構成ファイルを時々読み取る可能性があります。

ウォッチドッグの私の個人的なお気に入りはスーパーバイザーです。

$ supervisorctl start someapp
someapp: started

$ supervisorctl status someapp
someapp                RUNNING    pid 16583, uptime 19:16:26

$ supervisorctl stop someapp
someapp: stopped

プラットフォーム上の信号のリストを返すかどうかkill -lを確認し、それらのいくつかを試してください。ただし、SIGUSR1は悪い選択のようです。

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

[アップデート]

Carpetsmokerは、LinuxとBSDの動作の違いについて次のようにコメントしています。

SIGINFOは、GNUlibcとBSDでは動作が異なるようです。BSDでは、説明どおりに機能しますが、Linuxでは、存在しないか、SIGPWRと同じです... GNU libcのマニュアルは、この点で正しくないようです(kill-l出力にもSIGINFOが表示されません) )... GNUがそれをサポートしていない理由はわかりません。なぜなら、それは非常に便利だと思うからです... – Carpetsmoker

于 2012-05-30T22:48:50.687 に答える
3

SIGUSR1を受信したときのデフォルトのアクションは、ハンドラーが存在しない場合に終了することです。つまり、その信号ではもうやりたいことができなくなります。

ウォッチドッグを更新する以外にできることは何もありません(そして、シグナルを送信する前に、プログラム内からウォッチドッグのバージョンを区別することはできないと思います)。

于 2012-05-30T22:48:18.533 に答える