Wie kann ich überprüfen, ob ein laufender Prozess ein Signal erfasst, ignoriert oder blockiert? Im Idealfall möchte ich eine Liste von Signalen sehen oder muss das Signal zumindest nicht wirklich senden, um es zu überprüfen.
81
Unter Linux können Sie die PID Ihres Prozesses finden und dann anschauen /proc/$PID/status
. 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 hexadezimal in binär konvertieren, stellt jedes 1-Bit ein abgefangenes Signal dar und zählt von rechts nach links, beginnend mit 1. Wenn Sie also die SigCgt-Zeile interpretieren, können Sie sehen, dass mein init
Prozess die folgenden Signale erfasst :
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(Ich fand die Zuordnung von Nummer zu Name, indem ich kill -l
von der Bash aus lief.)
EDIT : 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
SigBlk
erscheint es auch inSigCgt
? Denn wenn Sie es blockieren, bedeutet dies nur, dass das Signal ein wenig später erneut gesendet wird, und dass das Signal abgefangen werden muss./proc
? Es wird nur unter Linux funktionieren ... undlocal
nicht unter POSIX. Nun, es ist ein bisschen, aber seine Wirkung ist "nicht spezifiziert"./bin/sh
. Da hast du rechtlocal
. Ich werde das aufräumen.Führen Sie unter Solaris
psig
die Prozess-ID aus, um eine Liste der Signale und deren Behandlung abzurufen.Zum Beispiel:
Dies zeigt, dass SIGHUP, SIGILL usw. alle von derselben Signalhandlerfunktion abgefangen werden
termsig_sighandler
, die ausgeführt wird, ohne eines der Flags zu verwenden, die über gesetzt werden könntensigaction
, und alle Signale, die vorübergehend maskiert werden, während der Signalhandler aktiv ist wird ausgeführt (in diesem Fall verwenden alle den gleichen Signalhandler, sodass er nicht erneut eingegeben wird, wenn er bereits ausgeführt wird). Sie können auch sehen, dass SIGQUIT & SIGTERM ignoriert wird, SIGKILL & SIGPWR die Standard-Signalaktionen des Systems verwendet und SIGCLD das RESTART-Flag angibt. Wenn der Signalhandler einen Systemaufruf unterbricht, wird der Syscall neu gestartet.quelle
(Diese Antwort ähnelt der Antwort von @ user18096, da ein Skript um die Antwort von @ Jander erstellt wird.)
Ich habe ein geschrieben
psig script
, um eine PID (oder alle PIDs) zu nehmen und eine für Menschen lesbare Ausgabe von den Signalmasken in zu erstellen/proc/<PID>/status
.Beispielausgabe:
Vorsichtsmaßnahmen:
with
und verwendetOrderedDict
.quelle
Ich komme immer wieder auf @ Janders hübsche Antwort zurück und hoffe auf einen Copy-and-Paste-Decoder, wenn ich mit Folgendem konfrontiert werde:
Ich schätze, ich muss etwas kaputtmachen ... sagen:
Ich wollte, dass es etwas leserlich ist, aber das macht es etwas umständlicher, es aufzurufen, als ich es gerne hätte. Dank @alancs Vorschlag werde ich es also als ~ / bin / psig speichern.
quelle
Verwenden
diese(link broken) diese Bibliothek, um Informationen über die laufenden Jobs zu erhalten.Es gibt ein spezielles Feld
struct Job
für die Signale, genanntsigCgt
Sie können so etwas verwenden:
quelle
Unter FreeBSD können Sie
procstat -i <PID>
sehen, welche Signale vom Prozess ignoriert werden. Auf ähnliche Weise können Sie feststellen,procstat -j <PID>
welche Signale von den Prozessthreads blockiert werden. Beide Befehle zeigen an, ob ein Signal ansteht.Beispielausgabe:
$ procstat -i 38540 PID COMM SIG FLAGS 38540 nsulfd HUP -I- 38540 nsulfd INT -I- 38540 nsulfd QUIT -I- 38540 nsulfd ILL --- 38540 nsulfd TRAP --- ...
$ procstat -j 38540 PID TID COMM SIG FLAGS 38540 101220 nsulfd HUP -- 38540 101220 nsulfd INT -- 38540 101220 nsulfd QUIT -B 38540 101220 nsulfd ILL -- 38540 101220 nsulfd TRAP -- ...
Siehe procstat (1) .
quelle