如何查看进程正在侦听的信号?

Modified on: Sat, 30 Jun 2018 10:42:00 +0800

如何验证正在运行的进程是捕获信号还是忽略信号或阻止信号?理想情况下,我希望看到一个信号列表,或者至少不必实际发送信号进行检查。

作者:Jander

最佳答案

在Linux下,您可以找到进程的PID,然后查看/proc/$PID/status。它包含描述哪些信号被阻塞(SigBlk),被忽略(SigIgn)或被捕获(SigCgt)的行。

# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...

右边的数字是位掩码。如果将它从十六进制转换为二进制,则每个1位表示一个捕获的信号,从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

(我通过从bash运行kill -l

编辑:根据大众需求,一个脚本,在POSIX中。

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
作者:,Jander

相关问答

添加新评论