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