GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare quali segnali sta ascoltando un processo?

Come posso verificare se un processo in esecuzione catturerà un segnale, lo ignorerà o lo bloccherà? Idealmente mi piacerebbe vedere un elenco di segnali, o almeno non devo inviare effettivamente il segnale per controllare.

Risposta accettata:

Sotto Linux, puoi trovare il PID del tuo processo, quindi guardare /proc/$PID/status . Contiene righe che descrivono quali segnali sono bloccati (SigBlk), ignorati (SigIgn) o catturati (SigCgt).

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

Il numero a destra è una maschera di bit. Se lo converti da esadecimale a binario, ogni 1 bit rappresenta un segnale catturato, contando da destra a sinistra iniziando da 1. Quindi, interpretando la riga SigCgt, possiamo vedere che il mio init il processo sta rilevando i seguenti segnali:

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

(Ho trovato la mappatura da numero a nome eseguendo kill -l da bash.)

MODIFICA :E a grande richiesta, uno script, in 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. Quali sono le cause dell'invio di vari segnali?

  2. Come controllare la versione di CentOS

  3. Cos'è un processo ininterrotto?

  4. Come verificare quali librerie condivise vengono caricate in fase di esecuzione per un determinato processo?

  5. Come controllare la dimensione dell'heap per un processo su Linux

Come uccidere un processo in Linux

Come controllare le porte di ascolto in Linux (porte in uso)

Come controllare la versione di Python

Come controllare la versione Java

Come verificare quale versione del kernel Linux sto utilizzando

Come controllare la versione OpenGL?