Bash 信号トラップの継承

Bash 信号トラップの継承

trapこのコマンドがどのように機能するかについて明確で不明瞭な情報を見つけるのに苦労しています。

特に、trap台本に局所効果が現れるか?私はいつもそれが本当だと思いましたが、反対の主張を見たことがあります。trap現在スクリプトから呼び出された他のシェルスクリプトに影響しますか?バイナリに影響しますか?

ベストアンサー1

十分速くテストできます。

$ cat test.sh
trap : INT HUP USR1
sleep 10h
$ ./test.sh &
[1] 29668
$ grep SigCgt /proc/$(pgrep test.sh)/status
SigCgt: 0000000000010203
$ grep SigCgt /proc/$(pgrep sleep)/status
SigCgt: 0000000000000000

したがって、trapバイナリファイルは影響を受けません。

スクリプトはどうですか?

$ cat blah.sh 
#! /bin/bash    
grep SigCgt /proc/$$/status
$ cat test.sh 
#! /bin/bash
trap : INT HUP USR1
./blah.sh
$ ./test.sh 
SigCgt: 0000000000010002

だから何かが捕まった。しかし、待って!

$ ./blah.sh 
SigCgt: 0000000000010002

とにかくこの信号は処理されそうです。


これマンページそれは言う:

   When a simple command other than a builtin or shell function is  to  be
   executed,  it  is  invoked  in  a  separate  execution environment that
   consists of the following.  Unless  otherwise  noted,  the  values  are
   inherited from the shell.
   ...
   ·      traps caught by the shell are reset to the values inherited from
          the shell's parent, and traps ignored by the shell are ignored

対応するビットマスクを信号セットに変換するには、次のようにします。

HANDLED_SIGS=$(awk '/SigCgt/{print "0x"$2}' /proc/$PID/status)
for i in {0..31} 
do 
    (( (1 << i) & $HANDLED_SIGS )) && echo $((++i)) $(/bin/kill --list=$i); 
done | column

この場合、処理する必要がない信号のセットは次のとおりtrapです。

$ HANDLED_SIGS=0x0000000000010002
$ for i in {0..31}; do (( (1 << i) & $HANDLED_SIGS )) && echo $((++i)) $(/bin/kill --list=$i); done | column
2 INT   17 CHLD

おすすめ記事