の信号を捕捉するための高度なシェルスクリプト

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

の信号を捕捉するための高度なシェルスクリプト

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

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

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

[root@linux1 ~]# kill -l
63) SIGRTMAX-1  64) SIGRTMAX    
[root@linux1 ~]# trap -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次のように、一般的な信号です。

Signal     Value     Comment
─────────────────────────────
SIGHUP        1      终止进程,特别是终端退出时,此终端内的进程都将被终止
SIGINT        2      中断进程,几乎等同于sigterm,会尽可能的释放执行clean-up,释放资源,保存状态等(CTRL+C)
SIGQUIT       3      从键盘发出杀死(终止)进程的信号

SIGKILL       9      强制杀死进程,该信号不可被捕捉和忽略,进程收到该信号后不会执行任何clean-up行为,所以资源不会释放,状态不会保存
SIGTERM      15      杀死(终止)进程,几乎等同于sigint信号,会尽可能的释放执行clean-up,释放资源,保存状态等

SIGSTOP      19      该信号是不可被捕捉和忽略的进程停止信息,收到信号后会进入stopped状态
SIGTSTP      20      该信号是可被忽略的进程停止信号(CTRL+Z)

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

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

kill -1 12345
kill -HUB 12345
kill -SIGHUB 12345

3、トラップオプション

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

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

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

[root@linux1 ~]# trap
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

4、信号の捕捉を行った後

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

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

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

[root@linux1 ~]# trap '' SIGINT SIGTERM
[root@linux1 ~]# trap
trap -- '' SIGINT
trap -- '' SIGTERM
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

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

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

[root@linux1 ~]# trap 'echo "我抓到你啦~"' TERM
[root@linux1 ~]# trap
trap -- '' SIGINT
trap -- 'echo "我抓到你啦~"' SIGTERM
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

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

[root@linux1 ~]# echo $$
8827
[root@linux1 ~]# kill -15 8827
我抓到你啦~
[root@linux1 ~]# kill -15 8827
我抓到你啦~
[root@linux1 ~]# kill -15 8827
我抓到你啦~

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

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

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

スクリプト:

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

[root@linux1 ~]# cat trap.sh
#!/bin/bash
trap '' SIGINT SIGTSTP
sleep 10
echo success

効果:

<フォント色=赤> CTRL + Cが眠りから私を防ぐことはできません。</ FONT>

[root@linux1 ~]# bash trap.sh 
^C^C^Z^Z^C^C^Z^Zccc^Z^Z^Z^C^C^C

success

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

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

[root@linux1 ~]# cat trap1.sh
#!/bin/bash

trap 'echo trap handing...;rm -rf /tmp/$BASHPID;echo TEMP files cleaned;exit' SIGINT SIGTERM SIGQUIT SIGHUP
mkdir -p /tmp/$$/
touch /tmp/$$/{a..c}.txt
sleep 10
echo first sleep success
sleep 10
echo second sleep success

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

効果

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

[root@linux1 ~]# bash trap1.sh 
^Ctrap handing...
TEMP files cleaned

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

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

[root@linux1 ~]# cat trap2.sh 
#!/bin/bash
trap 'echo trap_handle_time: $(date +"%F %T")' SIGINT SIGTERM
echo time_start: $(date +"%F %T")
sleep 10
echo time_end1: $(date +"%F %T")
sleep 10
echo time_end2: $(date +"%F %T")

#执行脚本后,新开终端使用kill -15杀死它
[root@linux1 ~]# killall -s SIGTERM trap2.sh

#查看输出情况
[root@linux1 ~]# ./trap2.sh 
time_start: 2019-08-27 10:43:48
trap_handle_time: 2019-08-27 10:43:58
time_end1: 2019-08-27 10:43:58
time_end2: 2019-08-27 10:44:08

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

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

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

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

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

[root@linux1 ~]# cat trap2.sh 
#!/bin/bash
trap 'echo trap_handle_time: $(date +"%F %T")' SIGINT SIGTERM
echo time_start: $(date +"%F %T")
sleep 10
echo time_end1: $(date +"%F %T")
sleep 10
echo time_end2: $(date +"%F %T")

#执行脚本后,立马CTRL+C
[root@linux1 ~]# bash trap2.sh 
time_start: 2019-08-27 10:20:53
^Ctrap_handle_time: 2019-08-27 10:20:54
time_end1: 2019-08-27 10:20:54
time_end2: 2019-08-27 10:21:04

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

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

.JPEG

おすすめ

転載: blog.51cto.com/14012942/2432858