Após o processo kill -9 não desaparecerá e a porta ainda estará ligada

5

Temos um aplicativo de servidor Java em execução no Mac OS X.

Ocasionalmente, esse aplicativo não responde, e nós recorremos a matá-lo com kill -9 . No entanto, o processo não desaparece; ele ainda aparece para ps , com parênteses em torno de seu nome e um ponto de interrogação na coluna STAT:

$ ps u -p 776
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
camadmin   776   0.0  0.0        0      0   ??  ?E    5:12PM   0:00.00 (java)

Além disso, a porta que está sendo usada pelo servidor ainda está vinculada:

$ netstat -na | grep 9902
tcp4       0      0  *.9902      *.*                    LISTEN

mesmo que não seja visível para lsof :

$ sudo lsof -P -i tcp | grep 9902
$

Com a porta ainda vinculada, não podemos reiniciar o aplicativo do servidor. Falta de reiniciar a máquina, o que pode ser feito para que a porta seja liberada e que esse processo seja realmente eliminado?

    
por Robert Tupelo-Schneck 11.06.2014 / 01:29

2 respostas

2

Seu processo está aguardando algo antes de poder sair.

Talvez uma chamada do sistema. Tentar acessar um arquivo que foi desmontado é um exemplo comum disso, ou um compartilhamento de rede indisponível.

Existe um processo pai ou filho que também precisa ser morto?

Eu não sou um usuário MacOS, mas no linux ps wwauxf | less é útil navegar pela hierarquia de processos para procurar pelos processos pai e filho. strace -p [pid] pode dizer algo útil sobre uma chamada de sistema atual que ainda não retornou.

-

EDIT: Seu processo foi iniciado por launchd? Parece que algumas pessoas têm problemas com isso (por exemplo, Como matar um processo "exit" no OS X (state = E) ) e como sugerido acima, você provavelmente precisará matar o processo pai, que neste caso é iniciado. Pode ser que não seja melhor que um reinício.

Presumivelmente, o launchd mantém uma conexão com seu aplicativo para reiniciá-lo se ele morrer, mas isso não é muito útil aqui.

Um kill -15 funciona melhor? ou seja, antes de entrar no estado que você descreve, não como uma maneira de sair disso.

    
por 14.06.2014 / 20:40
1

Estado E parece indicar que o processo está saindo. Mas o seu processo é basicamente um zumbi que nunca sai. Tudo on-line que encontrei mostra que há pouco que você pode fazer além de reinicializar, por exemplo, Como matar um processo "de saída" no OS X (state = E) . Se você não deseja reinicializar o servidor OSX devido a outros serviços afetados, considere (como soluções alternativas):

  • Migre apenas esse serviço java para uma máquina OSX separada que você pode reinicializar sempre que necessário, com impacto mínimo

  • Se você tiver RAM suficiente neste servidor, poderá criar uma VM e executar esse serviço de dentro da VM. Se o processo não responder e não for eliminado, você poderá apenas rejeitar a VM e não afetar o sistema operacional host. Já que se parece com Java, você não precisa necessariamente fazer o guest VM OSX. Talvez tente em um Ubuntu ou CentOS VM? Você pode baixar qualquer um deles como um appliance (arquivo OVA / VDI) e colocá-lo em funcionamento no VirtualBox em menos de 30 minutos. Pode até não ter o problema de zumbis em uma VM Linux. Consulte o link

por 14.06.2014 / 16:03