Как я могу проверить, какие сигналы прослушивает процесс?

Как проверить, будет ли выполняемый процесс поймать сигнал или проигнорировать его или заблокировать? В идеале я бы хотел увидеть список сигналов или, по крайней мере, не должен действительно посылать сигнал для проверки.

6 Solutions collect form web for “Как я могу проверить, какие сигналы прослушивает процесс?”

В 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.)

EDIT : И по популярности, сценарий, в 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 ab ; do printf "%s%s\n" "$a" "$(sigparse "$b")" done # | fmt -t # uncomment for pretty-printing 

В Solaris запустите psig на идентификаторе процесса, чтобы получить список сигналов и как они будут обрабатываться.

Например:

 bash-4.2$ psig $$ 11088: bash HUP caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST INT caught sigint_sighandler 0 QUIT ignored ILL caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST TRAP caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST ABRT caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST EMT caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST FPE caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST KILL default BUS caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST SEGV caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST SYS caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST PIPE caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST ALRM caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST TERM ignored USR1 caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST USR2 caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST CLD blocked,caught 0x4898e8 RESTART PWR default WINCH caught sigwinch_sighandler 0 [...] 

который показывает, что SIGHUP, SIGILL и т. д. будут пойманы одной и той же обработчикой сигналов termsig_sighandler , которая будет работать без использования каких-либо флагов, которые могут быть установлены с помощью sigaction , и всех сигналов, которые будут временно замаскированы, пока сигнал (в этом случае все те, которые используют один и тот же обработчик сигнала, поэтому он не возвращается в исходное состояние, хотя он уже запущен). Вы также можете увидеть, что SIGQUIT & SIGTERM будет проигнорирован, SIGKILL & SIGPWR использует сигналы сигнала по умолчанию для системы, а SIGCLD указывает флаг RESTART, поэтому, если его обработчик сигнала прерывает системный вызов, перезапуск системы будет перезапущен.

(Этот ответ аналогичен ответу @ user18096, поскольку он создает сценарий вокруг ответа @ Jander).

Я написал psig script для получения PID (или всех PID) и создания удобочитаемого вывода из масок сигнала в /proc/<PID>/status .

Пример вывода:

 % ./psig -a [ 1] Signals Queued: 8/773737 [ 1] Signals Pending: [ 1] Signals Pending (Shared): [ 1] Signals Blocked: [ 1] Signals Ignored: SIGPIPE [ 1] Signals Caught: SIGHUP,SIGINT,SIGABRT,SIGUSR1,SIGSEGV,SIGALRM,SIGTERM,SIGCHLD,SIGPWR ... [ 31001] Signals Queued: 0/773737 [ 31001] Signals Pending: [ 31001] Signals Pending (Shared): [ 31001] Signals Blocked: SIGHUP,SIGINT,SIGQUIT,SIGILL,SIGTRAP,SIGABRT,SIGBUS,SIGFPE,SIGUSR1,SIGUSR2,SIGPIPE,SIGALRM,SIGTERM,SIGSTKFLT,SIGCHLD,SIGCONT,SIGTSTP,SIGTTIN,SIGTTOU,SIGURG,SIGXCPU,SIGXFSZ,SIGPROF,SIGWINCH,SIGIO,SIGPWR,SIGSYS,SIGRTMIN,SIGRTMIN+1,SIGRTMIN+2,SIGRTMIN+3,SIGRTMIN+4,SIGRTMIN+5,SIGRTMIN+6,SIGRTMIN+7,SIGRTMIN+8,SIGRTMIN+9,SIGRTMIN+10,SIGRTMIN+11,SIGRTMIN+12,SIGRTMIN+13,SIGRTMIN+14,SIGRTMIN+15,SIGRTMAX-14,SIGRTMAX-13,SIGRTMAX-12,SIGRTMAX-11,SIGRTMAX-10,SIGRTMAX-9,SIGRTMAX-8,SIGRTMAX-7,SIGRTMAX-6,SIGRTMAX-5,SIGRTMAX-4,SIGRTMAX-3,SIGRTMAX-2,SIGRTMAX-1,SIGRTMAX [ 31001] Signals Ignored: SIGHUP,SIGINT,SIGQUIT,SIGPIPE,SIGXFSZ [ 31001] Signals Caught: SIGBUS,SIGUSR1,SIGSEGV,SIGUSR2,SIGALRM,SIGTERM,SIGVTALRM 

Предостережения:

  • Это конкретный ответ Linux.
  • Может потребоваться относительно новая версия Python для запуска скрипта, она использует with и OrderedDict .

Я продолжаю возвращаться к довольному ответу @ Jander, надеясь на декодер с копированием и вставкой, когда сталкивается с подобным:

 user@machine:~$ grep Sig...: /proc/18475/status SigPnd: 0000000000000000 SigBlk: fffffffe7dfbfaff SigIgn: 0000000000001000 SigCgt: 0000000182006e47 user@machine:~$ 

Думаю, мне придется что-то постучать … скажите:

 user@machine:~$ ruby -wn - /proc/18475/status <<'EOF' if $_.match(/Sig(Pnd|Blk|Ign|Cgt):\s([0-9a-f]{16})/) == nil next end field = $1 mask = $2.to_i(16) names = [] Signal.list().each_pair() { |name, number| if number == 0 # "EXIT" => 0 next end if (mask & (1 << (number - 1))) == 0 next end names << name } puts("Sig#{field}: #{names.join(" | ")}") EOF SigPnd: SigBlk: HUP | INT | QUIT | ILL | TRAP | IOT | ABRT | FPE | BUS | SYS | PIPE | ALRM | TERM | URG | TSTP | CONT | CHLD | CLD | TTIN | TTOU | IO | XCPU | XFSZ | PROF | WINCH | USR1 | USR2 | PWR | POLL SigIgn: PIPE SigCgt: HUP | INT | QUIT | BUS | SEGV | ALRM | TERM | VTALRM | USR1 | USR2 user@machine:~$ 

Я хотел, чтобы это было несколько разборчиво, но это сделало его немного неуклюже, чтобы вызвать, чем хотелось бы, поэтому, благодаря предложению @ alanc, я сохраню его как ~ / bin / psig.

использование это (ссылка сломана) эту библиотеку, чтобы получить информацию о выполняемых заданиях.

В struct Job для специального сигнала есть специальное поле, называемое sigCgt

Вы можете использовать что-то вроде этого:

 #include"read_proc.h" int main(void) { struct Root * rt=read_proc(); struct Job * jb=rt->first->job; printf("%ull\n",jb->sigCgt); return 0; } 

В 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) .

  • Как мягко убивать приложения gui через терминал?
  • Как эскалировать сигнал?
  • `EINTR`: есть ли обоснование?
  • Что происходит при отправке SIGKILL в Zombie Process в Linux?
  • Отправка сигнала в родительский процесс
  • Как работает nohup?
  • Как создать скрипт, который не может быть легко удален
  • Как сделать этот цикл Ctrl + C-прерывистым?
  • Обнаружение потери мощности
  • Какова цель отложенного приостановления (Ctrl-Y) в Bash?
  • Данные, записанные в / dev / pts / x внутри обработчика SIGINT (Ctrl + C), случайным образом отбрасываются
  • Linux и Unix - лучшая ОС в мире.