トラップ機能をコメントアウトすると、なぜcontrol-cが機能するのですか?

トラップ機能をコメントアウトすると、なぜcontrol-cが機能するのですか?

rhel VMを起動した後、ログファイル(tail -f xyz.log)に従いますが、control-cを使用して終了できないことに気づきました。私はcontrol-zを試しましたが、バックグラウンドジョブを終了したので、プロセスを手動で終了する必要がありました(tail -f xyz.log)。

私たちの店の誰かが/ etc / profileのトラップ機能をコメントアウトするように言ったので、そうしました。

#trap "" 1 2 3 15

その後、ログアウトして再度シェル環境にログインすると、control-cが機能し始めます!

私は何が起こっているのか理解したいと思います。 <マントラップ>をしましたが、残念ながらその中に含まれた内容をうまく活用できませんでした。時間をかけてこの記事を読んでくれてありがとう。

答え1

与えられたtrapコマンドはシェルに次の信号を傍受するように指示します。

1 SIGHUP
2 SIGINT
サム SIGQUIT
15SIGTERM

「」は、これらの信号のいずれかが受信されたときに実行されるコマンドです。つまり、何もしないで信号を完全に無視してください。

stty -aたとえば、この例の2番目の出力行を使用して、信号にバインドされている文字を確認できますstty(形式は使用しているシステムによって異なります)。

$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

一部の文字と信号の対応は次のとおりです。11.1.9 特殊文字、例えば、

  • intr送るSIGINT
  • quit送るSIGQUIT

だから私は^C送るSIGINT(あなたの構成は異なる場合があります)。

これをコメントアウトすると、trapシェルはデフォルトの動作に戻り、これらの特殊文字が入力されたときにシグナルを送信します(例:^\send)。SIGQUITそして^C送るSIGINT

追加資料:

答え2

端末でCtrl+を押すとCSIGINTが送信されます。シグナル端末で実行されているプロセスに。 (より正確には、フォアグラウンドプロセスグループ内のすべてのプロセスに送信されfoo | tail -fますfootail

伝統的な意味知能を知らせる(割り込み信号)は、「現在の作業を中断して対話型プロンプトに戻ります」です。インタラクティブなプロンプト(例:tail)を持たないプログラムは終了し、シェルの代わりになります。

これtrap注文する信号を受信するときのシェルの動作を定義します。たとえば、trap 'echo killed' INTシェルがSIGINT信号を受信するkilledと印刷します。trap 'echo killed' 2Linux PCでも同様です。 2はINTという信号の番号であるからです。他のプログラムがフォアグラウンドにある場合ではなく、シェルが信号を受信したときにのみ実行されます。

trap "" INT特別なケースです。信号を受信するときにシェルに何もしないように指示するだけでなく、シェルにも指示します。無視する信号。プロセスがシグナルのハンドラを登録しても、実行されるプログラムには影響しません。ハンドラはプロセス内のコードであり、他のプログラムから呼び出すことはできません。ただし、シグナルを無視することは、あるプログラムが別のプログラムを実行しても保持される別の設定です。したがって、後でtrap "" INT実行すると、tail信号はまだ無視され、Ctrl+を押してもC効果はありません。

シェルではシグナルを効果的に無視しますが、起動するプログラムではシグナルを無視したくない場合や、trap " " INT(trap : INTシェル:の no-op コマンド) のようなヌル以外のトラップを設定します.または、trap - INT実行前に実行して、tail信号処理をデフォルトの無視されない状態にリセットします。

答え3

trapこれはシェルに組み込まれており、一般的な形式はですtrap cmd list_of_signalscmdあなたの場合は空です。つまり、信号は無視されます。1hangupシグナル、銀、または3です。詳細については、章を参照してください。intrCtrl-Cman bashShell Builtin Commands

関連情報