Como descubro qual processo está consumindo sinais pendentes?

6

Um usuário recebe a seguinte mensagem quando tenta executar um programa específico.

timer_create: Resource temporarily unavailable

Deste StackOverflow Q & A intitulado: timer_create (): -1 EAGAIN (Recurso temporariamente indisponível) , descobri que isso tem a ver com a falta de espaço para sinais pendentes. Eu confirmei isso usando uma conta de usuário separada executando este comando:

$ ulimit -i 0

e verificando que recebo o mesmo erro, o que de fato eu faço. Com este comando:

$ ulimit -i 1

ou qualquer valor maior, não há erro.

Quando o usuário original executa ulimit -i , obtém 127368. Assim, concluí que eles ficaram sem espaço para sinais pendentes de alguma forma.

O que está acontecendo? Significa que um ou mais programas em execução os consumiram? Se sim, como descobrir quais?

    
por Tom Ellis 16.07.2013 / 21:42

1 resposta

3

Bem, essa não é uma solução bonita , mas pelo menos pode ser uma solução .

Em /proc/[pid]/status , há uma entrada para SigPnd e ShdPnd. Eles são descritos como,

SigPnd, ShdPnd: Number of signals pending for thread and for process as a whole (see pthreads(7) and signal(7)).

Há também o SigQ, que é

SigQ: This field contains two slash-separated numbers that relate to queued signals for the real user ID of this process. The first of these is the number of currently queued signals for this real user ID, and the second is the resource limit on the number of queued signals for this process (see the description of RLIMIT_SIGPENDING in getrlimit(2)).

(Tudo isso é de man 5 proc ).

Então você pode pesquisar todos os pid's em /proc , verificar os arquivos status e encontrar o que tiver algum sinal pendente.

Tente isso,

cd /proc

find . -name "status" | xargs grep SigPnd 2> /dev/null | grep -v "0000000000000000"

e

find . -name "status" | xargs grep ShdPnd 2> /dev/null | grep -v "0000000000000000"

    
por 16.07.2013 / 22:57

Tags