GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo verificar qué señales está escuchando un proceso?

¿Cómo puedo verificar si un proceso en ejecución captará una señal, la ignorará o la bloqueará? Idealmente, me gustaría ver una lista de señales, o al menos no tener que enviar la señal para verificar.

Respuesta aceptada:

En Linux, puede encontrar el PID de su proceso y luego mirar /proc/$PID/status . Contiene líneas que describen qué señales están bloqueadas (SigBlk), ignoradas (SigIgn) o capturadas (SigCgt).

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

El número a la derecha es una máscara de bits. Si lo convierte de hexadecimal a binario, cada bit representa una señal capturada, contando de derecha a izquierda comenzando con 1. Entonces, al interpretar la línea SigCgt, podemos ver que mi init El proceso está captando las siguientes señales:

00000000280b2603 ==> 101000000010110010011000000011
                     | |       | ||  |  ||       |`->  1 = SIGHUP
                     | |       | ||  |  ||       `-->  2 = SIGINT
                     | |       | ||  |  |`----------> 10 = SIGUSR1
                     | |       | ||  |  `-----------> 11 = SIGSEGV
                     | |       | ||  `--------------> 14 = SIGALRM
                     | |       | |`-----------------> 17 = SIGCHLD
                     | |       | `------------------> 18 = SIGCONT
                     | |       `--------------------> 20 = SIGTSTP
                     | `----------------------------> 28 = SIGWINCH
                     `------------------------------> 30 = SIGPWR

(Encontré la asignación de número a nombre ejecutando kill -l de bash.)

EDITAR :Y por demanda popular, un script, en 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

Linux
  1. Cómo verificar el uso de memoria del proceso con el comando pmap de Linux

  2. ¿Cómo probar qué Shell estoy usando en una terminal?

  3. ¿Qué causa que se envíen varias señales?

  4. Cómo comprobar los puertos de escucha/abiertos con Netstat en Linux

  5. Cómo comprobar la versión de CentOS

Cómo matar un proceso en Linux

Cómo comprobar los puertos de escucha en Linux (Puertos en uso)

Cómo comprobar la versión de Python

Cómo comprobar la versión de Java

Cómo comprobar qué versión del kernel de Linux estoy ejecutando

¿Cómo comprobar la versión de OpenGL?