Como posso verificar se um processo em execução captura um sinal, ignora-o ou bloqueia-o? Idealmente, eu gostaria de ver uma lista de sinais, ou pelo menos não ter que realmente enviar o sinal para verificar.
81
No Linux, você pode encontrar o PID do seu processo e ver /proc/$PID/status
. Ele contém linhas que descrevem quais sinais estão bloqueados (SigBlk), ignorados (SigIgn) ou capturados (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
O número à direita é uma máscara de bits. Se você o converter de hex para binário, cada 1 bit representa um sinal capturado, contando da direita para a esquerda começando com 1. Portanto, ao interpretar a linha SigCgt, podemos ver que meu init
processo está captando os seguintes sinais:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(Encontrei o mapeamento de número para nome executando kill -l
do bash.)
EDIT : E pela demanda popular, um script, no 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
, ele também aparecerá emSigCgt
? Porque, ao bloqueá-lo, isso significa apenas que o sinal será reenviado um pouco mais tarde, certo e precisa ser capturado?/proc
? Só vai funcionar no Linux ... Elocal
não é o POSIX. Bem, é meio que, mas seu efeito é "não especificado"./bin/sh
. Você está certolocal
; Eu vou limpar isso.No Solaris, execute
psig
o ID do processo para obter uma lista de sinais e como eles serão tratados.Por exemplo:
que mostra que SIGHUP, SIGILL etc. serão capturados pela mesma função de manipulador de sinal
termsig_sighandler
, que será executada sem o uso de nenhum dos sinalizadores que poderiam ser configurados viasigaction
e todos os sinais que serão temporariamente mascarados enquanto o manipulador de sinal estiver executando (neste caso, todos usando o mesmo manipulador de sinal, para que ele não seja reinserido enquanto estiver em execução). Você também pode ver que SIGQUIT & SIGTERM serão ignorados, SIGKILL & SIGPWR usam as ações de sinal padrão do sistema e SIGCLD especifica o sinalizador RESTART, portanto, se seu manipulador de sinais interromper uma chamada de sistema, o syscall será reiniciado.fonte
(Essa resposta é semelhante à resposta de @ user18096, na medida em que cria um script em torno da resposta de @ Jander.)
Eu escrevi a
psig script
para pegar um PID (ou todos os PIDs) e criar uma saída legível por humanos a partir das máscaras de sinal/proc/<PID>/status
.Exemplo de saída:
Ressalvas:
with
eOrderedDict
.fonte
Continuo voltando à bonita resposta do @ Jander, esperando um decodificador de copiar e colar quando confrontado com coisas como:
Acho que vou ter que bater alguma coisa ... diga:
Eu queria que fosse um pouco legível, mas isso tornou um pouco mais desajeitado invocar do que eu gostaria, então, graças à sugestão de @ alanc, vou salvá-lo como ~ / bin / psig.
fonte
Usar
esta(link quebrado) nesta biblioteca para obter informações sobre os trabalhos em execução.Existe um campo especial
struct Job
para os sinais, chamadosigCgt
Você pode usar algo como isto:
fonte
No FreeBSD, use
procstat -i <PID>
para ver quais sinais são ignorados pelo processo. Da mesma forma,procstat -j <PID>
para ver quais sinais estão bloqueados pelos encadeamentos do processo. Ambos os comandos mostram se um sinal está pendente.Saída de amostra:
$ 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 -- ...
Veja procstat (1) .
fonte