Jak mogę sprawdzić, czy uruchomiony proces złapie sygnał, zignoruje go lub zablokuje? Idealnie chciałbym zobaczyć listę sygnałów, a przynajmniej nie muszę wysyłać sygnału do sprawdzenia.
81
Pod Linuksem możesz znaleźć PID swojego procesu, a następnie spojrzeć na /proc/$PID/status
. Zawiera wiersze opisujące, które sygnały są blokowane (SigBlk), ignorowane (SigIgn) lub przechwycone (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
Liczba po prawej to maska bitowa. Jeśli przekształcisz go z szesnastkowego na dwójkowy, każdy 1-bit reprezentuje przechwycony sygnał, licząc od prawej do lewej, zaczynając od 1. Tak więc interpretując linię SigCgt, możemy zobaczyć, że mój init
proces przechwytuje następujące sygnały:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(Znalazłem mapowanie liczb na nazwy, uruchamiając kill -l
z bash.)
EDYCJA : I na żądanie, skrypt w 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
czy pojawia się również wSigCgt
? Ponieważ blokowanie go oznacza po prostu, że sygnał zostanie wysłany nieco później, prawda i trzeba go złapać?/proc
? Działa tylko w systemie Linux ... Ilocal
nie jest POSIX. Cóż, to trochę tak, ale jego efekt jest „nieokreślony”./bin/sh
. Masz racjęlocal
; Posprzątam to.W
psig
systemie Solaris uruchom identyfikator procesu, aby uzyskać listę sygnałów i sposób ich obsługi.Na przykład:
co pokazuje, że SIGHUP, SIGILL itp. zostaną przechwycone przez tę samą funkcję modułu obsługi sygnałów
termsig_sighandler
, która zostanie uruchomiona bez użycia żadnych flag, które można ustawić za pomocąsigaction
, oraz wszystkie sygnały, które zostaną tymczasowo zamaskowane, gdy moduł obsługi sygnału jest działa (w tym przypadku wszystkie używają tej samej procedury obsługi sygnału, więc nie jest ponownie wprowadzane, gdy już działa). Możesz również zobaczyć, że SIGQUIT i SIGTERM zostaną zignorowane, SIGKILL i SIGPWR używają domyślnych akcji systemowych sygnału, a SIGCLD określa flagę RESTART, więc jeśli jego procedura obsługi sygnału przerwie wywołanie systemowe, syscall zostanie zrestartowany.źródło
(Ta odpowiedź jest podobna do odpowiedzi @ user18096, ponieważ tworzy skrypt wokół odpowiedzi @ Jander.)
Napisałem a,
psig script
aby wziąć PID (lub wszystkie PID) i stworzyć czytelne dla człowieka wyjście z masek sygnałowych/proc/<PID>/status
.Przykładowe dane wyjściowe:
Ostrzeżenia:
with
iOrderedDict
.źródło
Wciąż wracam do ładnej odpowiedzi @ Jander, mając nadzieję na dekoder kopiuj-wklej, gdy widzę coś takiego:
Chyba będę musiał coś podrzucić ... powiedzieć:
Chciałem, aby było to trochę czytelne, ale to spowodowało, że nieco trudniej było go wywoływać, niż chciałbym, więc dzięki sugestii @ alanc, zapiszę go jako ~ / bin / psig.
źródło
Posługiwać się
to(uszkodzony link) ta biblioteka, aby uzyskać informacje o uruchomionych zadaniach.W
struct Job
sygnałach znajduje się specjalne pole , zwanesigCgt
Możesz użyć czegoś takiego:
źródło
W FreeBSD użyj,
procstat -i <PID>
aby zobaczyć, które sygnały są ignorowane przez proces. Podobnie,procstat -j <PID>
aby zobaczyć, które sygnały są blokowane przez wątki procesu. Oba polecenia pokazują, czy sygnał oczekuje.Przykładowe dane wyjściowe:
$ 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 -- ...
Zobacz procstat (1) .
źródło