¿Cómo puedo verificar si un proceso en ejecución captará una señal, la ignorará o la bloqueará? Idealmente, me gustaría ver una lista de señales, o al menos no tener que enviar la señal para verificar.
81
En Linux, puede encontrar el PID de su proceso y luego mirarlo /proc/$PID/status
. Contiene líneas que describen qué señales están bloqueadas (SigBlk), ignoradas (SigIgn) o capturadas (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
El número a la derecha es una máscara de bits. Si lo convierte de hexadecimal a binario, cada 1 bit representa una señal atrapada, contando de derecha a izquierda comenzando con 1. Entonces, al interpretar la línea SigCgt, podemos ver que mi init
proceso está captando las siguientes señales:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(Encontré el mapeo de número a nombre al ejecutar kill -l
desde bash).
EDITAR : Y por demanda popular, 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
¿también aparece enSigCgt
? Porque al bloquearlo, solo significa que la señal se reenviará un poco más tarde, ¿verdad y que hay que atraparla?/proc
? Solo funcionará en Linux ... Ylocal
no es POSIX. Bueno, es un poco, pero su efecto es "no especificado"./bin/sh
. Tienes razón sobrelocal
; Lo limpiaré.En Solaris, ejecute
psig
la identificación del proceso para obtener una lista de señales y cómo se manejarán.Por ejemplo:
que muestra que SIGHUP, SIGILL, etc., todos serán capturados por la misma función de controlador de señal
termsig_sighandler
, que se ejecutará sin usar ninguno de los indicadores que se pueden configurar a través desigaction
, y todas las señales que se enmascararán temporalmente mientras el controlador de señal esté en ejecución (en este caso, todos los que usan el mismo controlador de señal, por lo que no se vuelve a ingresar mientras ya se está ejecutando). También puede ver que SIGQUIT & SIGTERM serán ignorados, SIGKILL & SIGPWR usan las acciones de señal predeterminadas del sistema, y SIGCLD especifica el indicador RESTART, por lo que si su manejador de señales interrumpe una llamada del sistema, la llamada al sistema se reiniciará.fuente
(Esta respuesta es similar a la respuesta de @ user18096, ya que crea un script alrededor de la respuesta de @ Jander).
He escrito un
psig script
para tomar un PID (o todos los PID) y crear una salida legible por humanos a partir de las máscaras de señal/proc/<PID>/status
.Salida de ejemplo:
Advertencias:
with
yOrderedDict
.fuente
Sigo volviendo a la bonita respuesta de @ Jander esperando un decodificador de copiar y pegar cuando me enfrento a:
Supongo que tendré que golpear algo ... decir:
Quería que fuera algo legible, pero eso hace que invocar sea un poco más torpe de lo que quisiera, así que, gracias a la sugerencia de @ alanc, lo guardaré como ~ / bin / psig.
fuente
Utilizar
esta(enlace roto) esta biblioteca para obtener información sobre los trabajos que se están ejecutando.Hay un campo especial en el
struct Job
para las señales, llamadosigCgt
Puedes usar algo como esto:
fuente
En FreeBSD, use
procstat -i <PID>
para ver qué señales son ignoradas por el proceso. Del mismo modo,procstat -j <PID>
para ver qué señales están bloqueadas por los subprocesos del proceso. Ambos comandos muestran si hay una señal pendiente.Salida de muestra:
$ 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 -- ...
Ver procstat (1) .
fuente