
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
。
追加資料:
- トラップ - トラップ信号(POSIXシェル内蔵)、注釈
もし行動null( "" ) の場合、シェルは指定された各条件が発生すると無視します。
- Kill - プロセスを終了するか、シグナルを送信します。(標準信号名とその値を表示するPOSIXもあります。)
- stty - 端末オプションの設定
- SIGINTは他の終了信号とどのような関係がありますか?
答え2
端末でCtrl+を押すとCSIGINTが送信されます。シグナル端末で実行されているプロセスに。 (より正確には、フォアグラウンドプロセスグループ内のすべてのプロセスに送信されfoo | tail -f
ますfoo
。tail
伝統的な意味知能を知らせる(割り込み信号)は、「現在の作業を中断して対話型プロンプトに戻ります」です。インタラクティブなプロンプト(例:tail)を持たないプログラムは終了し、シェルの代わりになります。
これtrap
注文する信号を受信するときのシェルの動作を定義します。たとえば、trap 'echo killed' INT
シェルがSIGINT信号を受信するkilled
と印刷します。trap 'echo killed' 2
Linux 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_signals
。cmd
あなたの場合は空です。つまり、信号は無視されます。1
はhangup
シグナル、銀、または3
です。詳細については、章を参照してください。intr
Ctrl-C
man bash
Shell Builtin Commands