Comment puis-je vérifier si un processus en cours attrape un signal, l'ignore ou le bloque? Idéalement, j'aimerais voir une liste de signaux, ou du moins ne pas avoir à envoyer le signal à vérifier.
81
Sous Linux, vous pouvez trouver le PID de votre processus, puis regarder /proc/$PID/status
. Il contient des lignes décrivant les signaux bloqués (SigBlk), ignorés (SigIgn) ou capturés (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
Le nombre à droite est un masque de bits. Si vous le convertissez d'hex en binaire, chaque bit représente un signal capturé, en comptant de droite à gauche, en commençant par 1. Ainsi, en interprétant la ligne SigCgt, nous pouvons voir que mon init
processus capte les signaux suivants:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(J'ai trouvé le mappage numéro-à-nom en exécutant à kill -l
partir de bash.)
EDIT : Et à la demande générale, un script en 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
apparaît-il également dansSigCgt
? Parce qu'en le bloquant, cela signifie simplement que le signal sera renvoyé un peu plus tard correctement et que les besoins doivent être capturés?/proc
? Cela ne fonctionnera que sous Linux ... Etlocal
POSIX n'est pas. Eh bien, c'est un peu le cas, mais son effet est "non spécifié"./bin/sh
. Vous avez raisonlocal
; Je vais nettoyer ça.Sous Solaris, exécutez
psig
l'ID de processus pour obtenir une liste des signaux et leur traitement.Par exemple:
ce qui indique que SIGHUP, SIGILL, etc. seront tous capturés par la même fonction de gestionnaire de signal
termsig_sighandler
, qui sera exécutée sans utiliser aucun des indicateurs pouvant être définis viasigaction
, et tous les signaux qui seront temporairement masqués lorsque le gestionnaire de signal est en cours d'exécution (dans ce cas, tous ceux qui utilisent le même gestionnaire de signal, de sorte qu'ils ne sont pas réentrés lorsqu'ils sont déjà en cours d'exécution). Vous pouvez également voir que SIGQUIT & SIGTERM sera ignoré, que SIGKILL & SIGPWR utilise les actions de signal par défaut du système et que SIGCLD spécifie l'indicateur RESTART. Ainsi, si son gestionnaire de signaux interrompt un appel système, l'appel système sera redémarré.la source
(Cette réponse est similaire à celle de @ user18096, en ce sens qu'elle crée un script autour de la réponse de @ Jander.)
J'ai écrit un
psig script
pour prendre un PID (ou tous les PID) et créer une sortie lisible par l'homme à partir des masques de signaux de/proc/<PID>/status
.Exemple de sortie:
Mises en garde:
with
etOrderedDict
.la source
Je reviens sans cesse sur la jolie réponse de @ Jander dans l'espoir d'un décodeur copier-coller lorsque confronté à un problème similaire à:
Je suppose que je vais devoir casser quelque chose ... dis:
Je voulais que ce soit un peu lisible, mais cela rendait l'invocation un peu plus maladroite que je ne l'aurais souhaité, alors, grâce à la suggestion de @ alanc, je l'enregistrerai sous le nom ~ / bin / psig.
la source
Utilisation
cette(lien brisé) cette bibliothèque pour obtenir des informations sur les travaux en cours.Il y a un champ spécial dans le
struct Job
pour les signaux, appelésigCgt
Vous pouvez utiliser quelque chose comme ceci:
la source
Sous FreeBSD, utilisez
procstat -i <PID>
pour voir quels signaux sont ignorés par le processus. De même,procstat -j <PID>
pour voir quels signaux sont bloqués par les threads de processus. Les deux commandes indiquent si un signal est en attente.Exemple de sortie:
$ 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 -- ...
Voir procstat (1) .
la source