実行中のプロセスが信号をキャッチするか、無視するか、ブロックするかを確認するにはどうすればよいですか?理想的には、信号のリストを表示したい、または少なくとも実際に信号を送信して確認する必要はありません。
承認された回答:
Linuxでは、プロセスのPIDを見つけて、 / proc / $ PID / status
を確認できます。 。これには、ブロックされた信号(SigBlk)、無視された信号(SigIgn)、またはキャッチされた信号(SigCgt)を説明する行が含まれています。
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
右側の数字はビットマスクです。 16進数から2進数に変換すると、各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 </ code>を実行して、番号から名前へのマッピングを見つけました bashから。)
編集 :そして、人気のある要望により、POSIXshのスクリプト。
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