多くのUnixプログラムは、USR1
およびUSR2
。たとえば、Nginxの実行可能ファイルを即座にアップグレードするには、kill -USR2
。
という事は承知しています USR1
は「ユーザー定義」シグナルです。つまり、プログラムを作成した人は誰でも「シャットダウン」、「ログをダンプ」、「fooを1000回印刷」などを意味します。しかし、なぜこのarbitrary意的な名前を使用しなければならないのか理解できません。何故なの kill -UPGRADE
、またはkill -GRACEFUL_SHUTDOWN
? Unixは特定のシグナルのみを許可しますか?
Nginxは次のシグナルも使用します( documentation を参照)。
HUP?ウインチ?これらの名前の理由は何ですか?これについてどこでもっと知ることができますか?
OSで利用可能なシグナルは、OSによって定義されます(通常はPOSIXに準拠)-「文字列」ではなく、標準名の整数定数です。 USR1
およびUSR2
は、特定の意味が付加されていない2つの信号であり、開発者が望む任意の用途を対象としています。
Linuxマシンで、man 7 signal
信号処理と信号の概要について。
イベントに応じてこれらの信号を発行するOSに対処する準備ができていれば、他の信号の意味を再定義できます。できますmake HUP
は「構成の再読み込み」を意味します-プロセスがハングアップしないこと(端末の損失)がないことが確実であるか、ユーザーではなくOSが送信するケースを処理する準備ができている場合HUPシグナル。
HUP
は「ハングアップ」の略です。このシグナルは、制御端末がファイルの終わりに達するとプロセスに送信されます。昔は、通常、制御端末はシリアルポートに接続されていましたが、おそらく電話回線を介したモデムリンクを介して接続されていました。電話接続が切断されると、ローカルモデムがCarrier Detect行を下げ、カーネルがファイルの終わりを報告し、SIGHUP
信号が送信されます。
WINCH
は「ウィンドウ変更」の略です。制御端末のサイズが変更されると、プロセスに送信されます。明らかな理由から、サイズを変更できる端末は通常、最終的にウィンドウ環境で実行される端末エミュレータ(xterm
など)によって表される擬似端末です。
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
信号のnamesが(POSIXによって)標準化されているためです。独自のkillタイプの実行可能ファイルを作成して、-UPGRADE
必要に応じて、USR1
シグナルですが、UNIXに付属の標準kill
はそれを認識しません。
または、bash
エイリアスなどを使用して、エイリアス、関数、またはシェルスクリプトを作成して変換を行うこともできます。
alias upgrade='kill -USR1'
signal.h
ヘッダーファイルは、実装に依存する実際の値に信号名をマッピングします。
WINCH
に関しては、これは少し嫌悪感があると思います。これは、ウィンドウサイズが変更されたときに(特に、制御端末のウィンドウが変更されたときに)アプリケーションに配信される信号です。
このプロセスを使用してワーカースレッドを正常にシャットダウンすることは、プロセスが端末で決して実行されないことを保証できない限り、お勧めできません。アプリケーションを実行していて、ウィンドウを最大化したという理由だけで飛行中のすべての作業をキャンセルすることを決めた場合、私はかなり困惑することを知っています:-)
信号名は、Posixよりも早い時期に由来します。
SIG ** IOT **についてお話します。 DEC PDPメインフレームが使用されていた時代には、使用されるプロセッサには、gentlyシステムをクラッシュします。通常は、リアルタイムサーバーで強制的に再起動します。カーネル全体とデバイスドライバー、および特権プロセス(アセンブラーで記述)がこの方法を使用しました。今日でも、このIOT命令をまだ持っているプロセッサーがあります。
そのため、カーネルが非特権ドメインでIOT命令の実行を経験すると、影響を受けるプロセスに対してSIGIOTを発生させます。
POSIX準拠のプラットフォームでは、SIGUSR1
およびSIGUSR2
は、ユーザー定義の条件を示すためにプロセスに送信されるシグナルです。それらの記号定数はヘッダーファイルで定義されています signal.h
。信号番号はプラットフォームによって異なる可能性があるため、記号的な信号名が使用されます。
SIG
は、信号名の一般的なプレフィックスです。 USR
は、ユーザー定義の略語です。