O que poderia estar acontecendo entre pidof e kill para causar “nenhum tal processo”?

3

Eu herdei um pouco de código e estou olhando para um cron job que reinicia um serviço uma vez por hora, nenhum outro script toca esse processo e esse código é executado.

#The name of the process has been scrubbed to protect the guilty

procpid=$( pidof proc )
if [ -n "$procpid" ]; then
  kill -HUP $procpid
  procpid=$( pidof proc )
  if [ -z "$procpid" ]; then
    error "PROC ain't running, go figure out why"
  fi
fi

99,9999% do tempo que isso funciona. O problema é que eu sou do tipo cara que gosta de cinco 9 que odeia mensagens inexplicáveis de syslog sendo enviadas por e-mail para mim e quero saber por quê:

kill: (1076) - No such process

continua aparecendo lá. Isso significa necessariamente que alguma coisa está matando o meu processo entre o "se" e o "matar" ou algo mais insidioso poderia estar acontecendo?

Porque, com toda a probabilidade este código está bem e na verdade algo mais mata o processo entre as duas linhas, existe algo do tipo "diagnóstico que me matou" do verificador em algum lugar que eu poderia usar para depurar esses avisos?

    
por Peter Turner 23.04.2015 / 18:15

1 resposta

2

Sem saber mais alguma informação, especialmente a natureza do processo envolvido, eu teria que dizer, sim, eu acho que está morrendo entre pidof e kill . Você poderia usar killall em vez de basicamente todo o seu bloco de código. A condição de corrida ainda estaria presente, mas a janela seria mais curta.

Because in all likelihood this code is fine and in fact something else kills the process between the two lines, is there "what killed me" diagnostic sort of checker thing somewhere that I could use to at least debug why I'm getting these warnings?

O envio de sinais não é registrado no UNIX, então você não pode, em geral, saber "o que me matou". O que você poderia fazer facilmente, pelo menos, é executar o processo em questão em um script de shell wrapper. Isso pode pelo menos registrar o motivo pelo qual o processo morreu.

#!/bin/sh

proc
logger "proc died with status $?"

$? estará entre 0 e 127 se o processo sair normalmente e maior que 128 se tiver morrido devido ao recebimento de um sinal, com o número do sinal sendo $? -128.

    
por 23.04.2015 / 18:36