Как я могу проверить, будет ли запущенный процесс перехватывать сигнал, или игнорировать его, или блокировать? В идеале я хотел бы видеть список сигналов, или, по крайней мере, не нужно отправлять сигнал для проверки.
81
В Linux вы можете найти PID вашего процесса, а затем посмотреть /proc/$PID/status
. Он содержит строки, описывающие, какие сигналы заблокированы (SigBlk), проигнорированы (SigIgn) или перехвачены (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
Число справа является битовой маской. Если вы преобразуете его из шестнадцатеричного в двоичный, каждый 1-бит представляет пойманный сигнал, считая справа налево, начиная с 1. Таким образом, интерпретируя строку SigCgt, мы видим, что мой init
процесс перехватывает следующие сигналы:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(Я нашел отображение числа на имя, запустив kill -l
bash.)
РЕДАКТИРОВАТЬ : И по многочисленным просьбам, сценарий, в POSIX sh.
sigparse () {
i=0
# bits="$(printf "16i 2o %X p" "0x$1" | dc)" # variant for busybox
bits="$(printf "ibase=16; obase=2; %X\n" "0x$1" | bc)"
while [ -n "$bits" ] ; do
i="$(expr "$i" + 1)"
case "$bits" in
*1) printf " %s(%s)" "$(kill -l "$i")" "$i" ;;
esac
bits="${bits%?}"
done
}
grep "^Sig...:" "/proc/$1/status" | while read a b ; do
printf "%s%s\n" "$a" "$(sigparse "$b")"
done # | fmt -t # uncomment for pretty-printing
SigBlk
, он также отображается вSigCgt
? Потому что, блокируя его, это просто означает, что сигнал будет повторно послан чуть позже, и нужно его поймать?/proc
? Это будет работать только на Linux ... Иlocal
не POSIX. Ну, это вроде как, но его эффект "не определен"./bin/sh
. Вы правы насчетlocal
; Я уберу это.В Solaris запустите
psig
идентификатор процесса, чтобы получить список сигналов и способы их обработки.Например:
который показывает, что SIGHUP, SIGILL и т. д. будут пойманы одной и той же функцией обработчика сигнала
termsig_sighandler
, которая будет выполняться без использования каких-либо флагов, которые могут быть установлены с помощьюsigaction
, и всех сигналов, которые будут временно маскироваться, пока обработчик сигнала выполняется (в этом случае все используют один и тот же обработчик сигнала, поэтому он не будет повторно введен во время работы). Вы также можете видеть, что SIGQUIT & SIGTERM будут игнорироваться, SIGKILL и SIGPWR используют системные действия по умолчанию для сигналов, а SIGCLD задает флаг RESTART, поэтому, если его обработчик сигналов прерывает системный вызов, системный вызов будет перезапущен.источник
(Этот ответ похож на ответ @ user18096 в том смысле, что он создает сценарий вокруг ответа @ Jander.)
Я написал,
psig script
чтобы взять PID (или все PID) и создать читабельный вывод из масок сигналов/proc/<PID>/status
.Пример вывода:
Предостережения:
with
иOrderedDict
.источник
Я продолжаю возвращаться к красивому ответу @ Jander, надеясь на декодер копирования и вставки, когда сталкиваюсь с подобным:
Думаю, мне придется что-то сбить с ног ... сказать:
Я хотел, чтобы он был несколько разборчивым, но это делало его немного неуклюжим, чтобы вызывать его, поэтому, благодаря предложению @ alanc, я сохраню его как ~ / bin / psig.
источник
использование
это(ссылка не работает) эта библиотека для получения информации о выполняющихся заданиях.Существует специальное поле
struct Job
для сигналов, называемоеsigCgt
Вы можете использовать что-то вроде этого:
источник
В FreeBSD используйте,
procstat -i <PID>
чтобы увидеть, какие сигналы игнорируются процессом. Точно так же,procstat -j <PID>
чтобы увидеть, какие сигналы заблокированы потоками процесса. Обе команды показывают, ожидает ли сигнал.Образец вывода:
$ procstat -i 38540 PID COMM SIG FLAGS 38540 nsulfd HUP -I- 38540 nsulfd INT -I- 38540 nsulfd QUIT -I- 38540 nsulfd ILL --- 38540 nsulfd TRAP --- ...
$ procstat -j 38540 PID TID COMM SIG FLAGS 38540 101220 nsulfd HUP -- 38540 101220 nsulfd INT -- 38540 101220 nsulfd QUIT -B 38540 101220 nsulfd ILL -- 38540 101220 nsulfd TRAP -- ...
Смотрите procstat (1) .
источник