Сигналы, полученные bash при закрытии терминала - PullRequest
11 голосов
/ 05 апреля 2011

Используйте ловушку для захвата сигналов следующим образом:

i=-1;while((++i<33));
do
    trap "echo $i >> log.txt" $i;
done

И принудительно закройте терминал.

Тогда содержимое в log.txt (под redhat linux):

1

18

1

17

0

Откуда поступают эти сигналы?

Ответы [ 2 ]

12 голосов
/ 05 апреля 2011

Первый сигнал - SIGHUP;он отправляется всем процессам в группе процессов, когда терминал отключается (зависает - значит, HUP).

Второй сигнал - SIGCONT (спасибо, SiegeX, за цифры).Это немного удивительно;это говорит о том, что вы остановили задание в фоновом режиме, которое нужно было запустить снова.

Третий сигнал - это еще один SIGHUP.Скорее всего, это было отправлено, чтобы убедиться, что продолжение процесса завершено, но оно было отправлено всей группе процессов.(См. Стандарт POSIX для получения информации о группах процессов и т. Д.).

Четвертый сигнал - это SIGCHLD, указывающий, что дочерний процесс умер и труп доступен (ну, статусдоступен.)

Последний сигнал, 0, является внутренним псевдосигналом оболочки, указывающим, что он выходит.

Вы можете сделать:

trap 'echo Bye' 0

, чтобы повторить«Пока», когда оболочка выходит из-под контроля по любой причине.Вы выбрали отображение сигнала в файл вместо этого.Поскольку оболочка выходит в этот момент, это последнее сигнальное сообщение, которое видно.Его родительский процесс должен получить сигнал SIGCHLD, потому что оболочка умерла.


FWIW, на MacOS X 10.6.7 я выполнил ваш тест.В MacOS X отсутствует сигнал 32, и некоторые сопоставления отличаются, и последовательность отправленных сигналов также отличается:

$ i=-1;while((++i<33));
> do
>     trap "echo $i >> log.txt" $i;
> done
-sh: trap: 32: invalid signal specification
$ trap
trap -- 'echo 0 >> log.txt' EXIT
trap -- 'echo 1 >> log.txt' HUP
trap -- 'echo 2 >> log.txt' INT
trap -- 'echo 3 >> log.txt' QUIT
trap -- 'echo 4 >> log.txt' ILL
trap -- 'echo 5 >> log.txt' TRAP
trap -- 'echo 6 >> log.txt' ABRT
trap -- 'echo 7 >> log.txt' EMT
trap -- 'echo 8 >> log.txt' FPE
trap -- 'echo 9 >> log.txt' KILL
trap -- 'echo 10 >> log.txt' BUS
trap -- 'echo 11 >> log.txt' SEGV
trap -- 'echo 12 >> log.txt' SYS
trap -- 'echo 13 >> log.txt' PIPE
trap -- 'echo 14 >> log.txt' ALRM
trap -- 'echo 15 >> log.txt' TERM
trap -- 'echo 16 >> log.txt' URG
trap -- 'echo 17 >> log.txt' STOP
trap -- 'echo 19 >> log.txt' CONT
trap -- 'echo 20 >> log.txt' CHLD
trap -- 'echo 23 >> log.txt' IO
trap -- 'echo 24 >> log.txt' XCPU
trap -- 'echo 25 >> log.txt' XFSZ
trap -- 'echo 26 >> log.txt' VTALRM
trap -- 'echo 27 >> log.txt' PROF
trap -- 'echo 28 >> log.txt' WINCH
trap -- 'echo 29 >> log.txt' INFO
trap -- 'echo 30 >> log.txt' USR1
trap -- 'echo 31 >> log.txt' USR2
$

Сигналы, полученные за один прогон:

2
1
20
0

Во втором прогоне я получил:

20
1
20
0

Сначала SIGINT удивляет - я не думаю, что смогу объяснить это, если это просто не означает какую-то неполную запись (должен был прочитать 20, но SIGHUP вызвал проблему).Я не уверен, что могу объяснить сигналы SIGCHLD;ловушка SIGHUP и 'exit' такие же, как и раньше.

В некоторой степени, однако, сигналы зависят от конкретной системы - или так кажется.Тем не менее, SIGHUP является обычным и постоянным.

5 голосов
/ 05 апреля 2011

Если вы спрашиваете, каков каждый из сигналов, используйте kill -l

$ kill -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     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Обратите внимание, что kill -0 <PID> ничего не делает, кроме как возвращает код выхода, чтобы указать, можно ли отправить сигналв ПИД

...