GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie überprüft man, auf welche Signale ein Prozess hört?

Wie kann ich überprüfen, ob ein laufender Prozess ein Signal abfängt, ignoriert oder blockiert? Idealerweise möchte ich eine Liste von Signalen sehen oder muss das Signal zumindest nicht zur Überprüfung senden.

Akzeptierte Antwort:

Unter Linux können Sie die PID Ihres Prozesses finden und dann unter /proc/$PID/status nachsehen . Es enthält Zeilen, die beschreiben, welche Signale blockiert (SigBlk), ignoriert (SigIgn) oder abgefangen (SigCgt) werden.

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

Die Zahl rechts ist eine Bitmaske. Wenn Sie es von Hex in Binär umwandeln, stellt jedes 1-Bit ein abgefangenes Signal dar, wobei von rechts nach links beginnend mit 1 gezählt wird. Wenn wir also die SigCgt-Zeile interpretieren, können wir sehen, dass mein init Der Prozess fängt die folgenden Signale ab:

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

(Ich habe die Zuordnung von Nummer zu Name gefunden, indem ich kill -l ausgeführt habe von bash.)

BEARBEITEN :Und auf vielfachen Wunsch ein Skript 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. Was bewirkt, dass verschiedene Signale gesendet werden?

  2. Was ist ein unterbrechungsfreier Prozess?

  3. So überprüfen Sie die Heap-Größe für einen Prozess unter Linux

  4. Was sind ausstehende Signale?

  5. Wie überprüfe ich die Festplatten-E/A-Auslastung pro Prozess?

So beenden Sie einen Prozess in Linux

So suchen Sie unter Linux nach Listening Ports (Ports in use)

So überprüfen Sie die Python-Version

So überprüfen Sie die Java-Version

So überprüfen Sie, welche Linux-Kernel-Version ich verwende

Wie überprüfe ich die OpenGL-Version?