GNU/Linux >> Tutoriels Linux >  >> Linux

Comment vérifier quels signaux un processus écoute ?

Comment puis-je vérifier si un processus en cours d'exécution captera un signal, l'ignorera ou le bloquera ? Idéalement, j'aimerais voir une liste de signaux, ou du moins ne pas avoir à envoyer le signal pour vérifier.

Réponse acceptée :

Sous Linux, vous pouvez trouver le PID de votre processus, puis regarder /proc/$PID/status . Il contient des lignes décrivant les signaux bloqués (SigBlk), ignorés (SigIgn) ou interceptés (SigCgt).

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

Le nombre à droite est un masque de bits. Si vous le convertissez d'hex en binaire, chaque bit 1 représente un signal capturé, en comptant de droite à gauche en commençant par 1. Ainsi, en interprétant la ligne SigCgt, nous pouvons voir que mon init le processus capte les signaux suivants :

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

(J'ai trouvé le mappage numéro-nom en exécutant kill -l de bash.)

MODIFIER :Et à la demande générale, 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. Comment vérifier l'écoute / les ports ouverts avec Netstat sous Linux

  2. Comment vérifier si un processus est toujours en cours d'exécution en utilisant Python sous Linux ?

  3. Comment vérifier quelles bibliothèques partagées sont chargées au moment de l'exécution pour un processus donné ?

  4. Comment vérifier la taille du tas pour un processus sous Linux

  5. Comment puis-je déterminer quel processus en cours d'exécution utilise Java ?

Comment tuer un processus sous Linux

Comment vérifier les ports d'écoute sous Linux (ports utilisés)

Comment vérifier la version de Python

Comment vérifier la version Java

Comment vérifier quelle version du noyau Linux suis-je en cours d'exécution

Comment vérifier la version d'OpenGL ?