Сигналы, принимаемые bash при закрытии терминала

используйте trap для захвата таких сигналов:

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

и закройте терминал силой.

содержимое журнала.txt тогда (под redhat linux):

1

18

1

17

0

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

2 ответов


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

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

третий сигнал-еще один вздох. Это, вероятно, было отправлено для обеспечения того, чтобы продолжающийся процесс получил свою очередь выйти, но был отправлен вся группа процессов. (См. POSIX стандарт для информации на отростчатых группах, etc.).

четвертым сигналом является 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

СИГИНТ сначала удивляет - я не думаю, что могу объяснить это, если это просто не означает, что какая-то неполная запись (она должна была прочитать 20, но вздох вызвал проблему). Я не уверен, что могу объяснить сигналы SIGCHLD; вздох и ловушка "выхода", как и раньше.

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


Если вы спрашиваете, что каждый из сигналов, используйте 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

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