高度なシェルスクリプトの信号キャプチャトラップ

シェルスクリプトの信号をキャプチャ

トラップは、トラップが意味するように変換し、トラップでシェルスクリプトは信号を捕捉するように設計されています。どのような信号のですか?このような頻繁に使用される殺虫よう-9、-15を殺す、CTRL + Cは、信号を属し

図1に示すように、利用可能なすべての信号を表示します

トラップ-lまたは-l殺すために

[ルート@のlinux1〜]#は-l殺す
63)SIGRTMAX-1 64)SIGRTMAX   
[ルート@ linux1〜]#トラップ-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
...... 

2次のように、一般的な信号です。

値は、信号コメント
─────────────────────────────
このプロセス内の端末出口は、終了する場合は特に、処理を終了するSIGHUP 1終了
SIGINT 2は、クリーンアップ、リソースの解放、保全状況(CTRL + C)の実装を可能な限りリリースする予定、SIGTERMとほぼ同等、処理を中断
(終了)キーボードキルから送られたSIGQUIT信号が3を処理します

SIGKILL 9プロセスを強制終了することを強制、信号をキャッチして無視できないリソースが解放されないように、信号を受信した後、任意のクリーンアッププロセスの動作を行わず、状態は保存されません
SIGTERM 15ほとんどキル(終了)プロセスを、 SIGINTシグナルに相当、リソースのクリーンアップを可能な限り、リリース、保全状況などの実装をリリースする予定

SIGSTOP 19信号が捕捉され、停止状態入る信号を受信した後、情報の停止過程で無視できない
SIGTSTP 20は、信号処理は、停止信号を無視することが可能である(CTRL + Z)

実際の信号名はSIGXXXではなく、単語SIGを除去し、各信号ならびに対応するコードの後

例えば、PID 12345に処理するための信号を開始します

殺す-1 12345
キル-HUB 12345
キル-SIGHUB 12345

3、トラップオプション

サポートされている信号システムの現在のリストを一覧表示-lトラップは、上記で使用されている、同じルート-l殺します

トラップに相当トラップ-p、トラップは、シェルを表示するように構成されています

あなたは、3つのデフォルトのシェルトラップがある参照20,21,22信号を省略することができます

[ルート@のlinux1〜]#の階段の
階段- 'SIGTSTPの
段階- ' SIGTTINの
段階- 「SIGTTOU

図4は、なぜ信号捕捉後
•信号を無視する
•処理に対応する信号を捕捉します。メインは、スクリプトによって作成された一時ファイルをクリーンアップして、終了しています。

図5に示すように、CTRL + Cを無視することができるトラップおよび信号15が設けられています。

CTRL信号はSIGINT 15 SIGTERMに対応した信号に対応します

[ルート@のlinux1〜]#トラップ'' SIGINTをSIGTERM
[ルート@ linux1〜]#トラップ
トラップ- '' SIGINTの
トラップ- '' SIGTERMの
罠- '' SIGTSTPの
罠- '' SIGTTINの
罠- '' SIGTTOU

このように、現在のシェルは、killで殺さすることはできません-15

6、信号-15を捕獲するトラップを設定し、印刷は「私はとにかくあなたをキャッチ...」

[ルート@のlinux1〜]#トラップ ' "エコーTERM私は〜とにかくあなたを捕まえた"'
[ルート@ linux1〜]#トラップ
トラップ- '' SIGINTの
罠- '' SIGTERMの"私は〜とにかくあなたを捕まえた"エコー
トラップを- '' SIGTSTPの
罠- '' SIGTTINの
罠- '' SIGTTOU

効果は、私はbashのキル-15信号電流を起動したときにプリントアウトされます

[ルート@ linux1〜]#は$$エコー
8827を
[ルート@ linux1〜]#キル-15 8827
私はあなたにとにかく〜キャッチ
[ルート@ linux1〜]#キル-15 8827
私は〜とにかくあなたを捕まえ
[ルート@ linux1〜を]#は-15 8827殺す
〜私はとにかくあなたをキャッチ

図7に示すように、スクリプトCTRL + CおよびCTRL + Z信号を無視することができるスクリプトに設けられています

CTRL + C 2信号、すなわちSIGINT

CTRL + Z信号20、すなわちSIGTSTP

スクリプト:

10Sを寝スクリプトは、その後、成功を印刷し、スクリプトが信号を無視INTとTSTP

[ルート@ linux1〜]#猫trap.shの
#!/ binに/ bashのを
トラップ'' SIGINTのSIGTSTPの
睡眠10は、
成功をエコー

効果:

<フォントの色=赤> CTRL + Cがスリープ</フォント>から私を防ぐことはできません

[ルートLinuxの1〜@]#件のbash trap.sh
^ C ^ C ^ Z ^ Z ^ C ^ C ^ Z ^ CCC ^ Z ^ Z ^ Z ^ C ^ C ^ C

成功

スクリプトは、ゴミをクリーンアップし、すぐにトラップスクリプトを終了させることができる場合8は、端子配置しました

次のようにスクリプトは次のとおりです。

[ルート@ linux1〜]#猫trap1.shの
#!/ binに/ bashの

トラップは、 '; RM -rf / tmpに/ $ BASHPID; ...トラップ取り扱いをエコー洗浄TEMPファイルエコー;終了' SIGINT SIGTERM SIGQUIT SIGHUP
ます。mkdir -p / tmpに/ $$ /
タッチ/tmp/$$/{a..c } .txtの
睡眠10
第睡眠成功エコー
睡眠10
秒のスリープ成功エコー

このように、SIGKILLシグナル(殺す-9)を除き、スクリプトは、常に一時的なゴミを一掃します

効果

再入力してシェルを終了するには、CTRL + Cを無視するようにトラップを設定するトラップの下に自分自身を発見始まりを終了することができませんでした、と後にシェルの前で行われています

[ルート@ linux1〜]#件のbash trap1.sh
^ Ctrapの取り扱い...
洗浄TEMPファイル

9、トラップ保護者オブジェクト

トラップガードは、オブジェクトは、シェルプロセス自体ではなく、シェル環境内の子供の保護者です。それは、信号の種類トラップを無視する場合でも、全体のシェルデーモンプロセスグループは、与えられた信号を無視するようになります。

[ルート@ linux1〜]#猫trap2.shの
#/ binに/バッシュ!
トラップ'エコーtrap_handle_time:$(日付+ "%F%T")' SIGINTをSIGTERM
エコー時間_:$(日付+ "%F%T")
睡眠10は
time_end1エコー:$(日付+ "%F%T")は、
10寝
$(日付+ "%のF%T"):time_end2エコー

スクリプトを実行した後#、キル-15使用して、それを殺すために新しいターミナルを開き
、[ルート@ linux1を〜]#killallを -s SIGTERM trap2.sh

#出力状況を見る
[ルート@ linux1〜]#の./trap2.shの
TIME_START:2019年8月27日10時43分48秒
trap_handle_time:2019年8月27日午前10時43分58秒
time_end1:2019年8月27日10:43 :58
time_end2:2019年8月27日10時44分08秒

実行killが、見つけることができ、画面はすぐにtrap_handle印刷されませんが、唯一の10回で印刷した後に眠ります。プロセスの睡眠保護者は、型トラップを無視してきました

限り信号がシェルプロセスに送られるように、現在実行中のプロセスのコマンド信号の終了後に待機した後、スクリプトを下に実行していきます。(実際には、操作のシェルスクリプトが実行された場合にのみ、安全な信号システムコールがあり、プロセスがシェルにさまざまなコマンドで、表示され割り込むことができない信号が、我々はコマンドが何であるかを直接知ることができませんシステムコールは)システムコールを実行しています。

スリープコマンドがスリープ()の呼び出しを開始した。しかし、信号が安全であるので、上記のスクリプトの実行中に寝て、信号が直接自分の動作を中断しませんが、それは、信号処理を行うために、再度コマンドを実行した後に終了するのを待ちます。

10、シェルは信号のトラップを設定し、シェルプロセスが信号を受信した場合、<フォント色=赤>プロセストラップ</フォント>の終了前に実行開始内のコマンドを待機します

11、CTRL + CとSIGINT等価ではありません。時間は、現在のプロセスを実行しているセット全体SIGINT信号に伝達されるCTRL + Cを押したとき。そのためのシェルスクリプトは、SIGINTはまた、現在のスクリプトを実行しているプロセスに送信され、シェルスクリプトのプロセスに送信されません

[ルート@ linux1〜]#猫trap2.shの
#/ binに/バッシュ!
トラップ'エコーtrap_handle_time:$(日付+ "%F%T")' SIGINTをSIGTERM
エコー時間_:$(日付+ "%F%T")
睡眠10は
time_end1エコー:$(日付+ "%F%T")は、
10寝
$(日付+ "%のF%T"):time_end2エコー

#スクリプトを実行した後、すぐ+ C、Ctrl
[ルート@ linux1〜]#件のbash trap2.shの
TIME_START:2019年8月27日午前10時20分53秒
^ Ctrap_handle_time:2019年8月27日午前10時20分54秒
time_end1:2019から08 10時20分54秒-27
time_end2:2019年8月27日10時21分04秒

これは、CTRL + Cの後に見いだされることができるだけでなく、トラップ処理、睡眠はまた、上に飛んだ。CTRL + Cは、現在のプロセスがSIGINT信号を受信させ、スクリプトプロセスだけでなくSIGINT信号を受信示します

理解しにくいビットは、再び来て、見て。

おすすめ

転載: www.linuxidc.com/Linux/2019-08/160388.htm