Наследование Bash сигнализирует о прерываниях

Я полагаю, что это, вероятно, делает то, что Вы хотите:

sudo lshw
5
02.12.2014, 13:08
2 ответа

Это не ответ, но...

$ cat Trap.sh
#!/bin/bash

echo "Trap.sh is PID $$"
trap -p
grep Sig /proc/$$/status

trap 'echo SIGINT' SIGINT
trap -p
grep Sig /proc/$$/status

trap 'echo SIGTERM' SIGTERM
trap -p
grep Sig /proc/$$/status

trap 'echo SIGUSR1' SIGUSR1
trap -p
grep Sig /proc/$$/status

$ ./Trap.sh
Trap.sh is PID 13887
SigQ:   0/63517
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000004
SigCgt: 0000000043817efb
trap -- 'echo SIGINT' SIGINT
SigQ:   0/63517
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000004
SigCgt: 0000000043817efb
trap -- 'echo SIGINT' SIGINT
trap -- 'echo SIGTERM' SIGTERM
SigQ:   0/63517
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000004
SigCgt: 0000000043817efb
trap -- 'echo SIGINT' SIGINT
trap -- 'echo SIGUSR1' SIGUSR1
trap -- 'echo SIGTERM' SIGTERM
SigQ:   0/63517
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000004
SigCgt: 0000000043817efb

Я понятия не имею, что это значит. Моя догадка заключается в том, что Бэш все ловит в ловушку, а потом решает, что делать внутри этой ловушки.

0
27.01.2020, 20:42

Вы можете проверить его достаточно быстро:

$ 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

Похоже, эти сигналы в любом случае обращаются.


MANPAGE имеет это сказать:

   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

в этом случае набор сигналов, которые обрабатывались без Ловушка были:

$ 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
2
27.01.2020, 20:42

Теги

Похожие вопросы