Como encontrar a fonte do processo de desova?


12

Eu tenho um processo Java em execução em uma instância do RedHat Linux.

O problema é que continua reaparecendo depois que eu o mato. Não sei para onde olhar. Eu já fui ao crontab, mas sem sorte.

Eu olhei para o PPID, mas aponta para init (1).

Alguma idéia de como posso descobrir a fonte?


1
Você pode nos dar algo para continuar? O processo grava em algum arquivo, por exemplo? Você pode nos mostrar o resultado de ps xfmostrar a árvore do processo? Tal como está, temos muito pouco a seguir.
terdon

Você disse que foi ao crontab ... Você também verificou atse algum deles é esse ?.
YoMismo

Você pode nos dizer qual software java você está realmente executando. Vi ferramentas como o Cassandra, que na verdade têm um cão de guarda interno em determinadas configurações que acionam outra instância do banco de dados assim que a primeira instância falha (não foi interrompida normalmente).
Matthias Steinbauer

Respostas:


15

Existem várias possibilidades (algumas mencionadas em outras respostas):

  1. Um cronjob de sistema ou usuário executando frequentemente,
  2. No SysV init, uma /etc/inittabentrada para o serviço com orespawn diretiva,
  3. No systemd, um arquivo de unidade com a Restartopção definida como um valor diferente deno ,
  4. No Upstart, um arquivo de configuração de serviço com a respawndiretiva,
  5. Uma ferramenta de monitoramento de processos como monit, ou
  6. Um processo de vigilância ad-hoc para esse serviço específico.

Uma nova ferramenta interessante (somente Linux) que poderia fornecer mais informações sobre onde o processo está sendo iniciado é o sysdig .

O Sysdig usa os recursos de ponto de rastreamento do Linux Kernel para fornecer o que equivale a um sistema rápido e amplo strace.

Por exemplo, se eu quisesse ver todos os processos sendo iniciados ls, posso emitir:

sudo sysdig evt.type=execve and evt.arg.exe=ls

Quando lsé executado em algum lugar, vou receber uma mensagem como esta:

245490 16:53:54.090856066 3 ls (10053) < execve res=0 exe=ls args=--color=auto. tid=10053(ls) pid=10053(ls) ptid=9204(bash) cwd=/home/steved fdlimit=1024 pgft_maj=0 pgft_min=37 vm_size=412 vm_rss=4 vm_swap=0 env=...

Trunquei as informações do ambiente retornadas, mas como você pode ver, no ptid posso ver o nome e o pid do programa chamado execve. execveé a chamada de sistema usada no Linux usada para executar novos comandos (todas as outras chamadas de exec são apenas frontends para execve).


2
sysdig é um ótimo conselho! BTW, agora está disponível para Windows (e Mac, eu acho) com funcionalidade limitada.
Neowizard

Como o monit ajuda aqui? Comecei a ler o manual, mas parece uma alternativa ou backup para algo como o Nagios. Não estou vendo como isso o ajudaria a rastrear um processo de reaparecimento.
91119 Jefferson Hudson

7

Eu acredito que você poderia usar pstree. Você pode especificar o comando como,

pstree -p PID

O texto acima fornece uma lista de todos os pais dos aplicativos java.


1
Isso não vai ajudar em tudo, como o OP já disse que ele olhou para o PPID, que é 1.
Guntram Blohm suporta Monica

@GuntramBlohm, observe a pergunta original antes de ser editada. Não foi mencionado na primeira versão da pergunta.
Ramesh

2
suspiro. Outro pôster que faz de sua pergunta um alvo em movimento sem marcar suas edições :(
Guntram Blohm apoia Monica

5

Você pode dar uma olhada no seu PPID (ID do processo pai):

$ ps -eo pid,ppid,args | grep java

Depois de obter o PPID (segunda coluna) do seu processo Java, use psnovamente para encontrar o processo associado:

$ ps -p [PPID]

Edit : se o pai é 1 (init), o primeiro pai do seu processo Java morreu logo após "dar à luz" (que triste). Por esse motivo, não é possível usar a hierarquia de processos atual para encontrá-la. A primeira coisa que eu recomendo que você faça é verificar ps -ef. Você pode encontrar o culpado apenas lendo a saída.

Então, dê uma olhada nos crontabs (você já fez isso, mas não vai doer):

$ for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

Isso exigirá privilégios de root.

Ainda não consegue ver um processo Java agendado? Que droga. Vamos tentar outra coisa. Se o seu processo Java estiver presente desde a inicialização, consulte os programas selecionados no momento da inicialização. Eu sugeriria algo como ...

$ grep -iR java /etc/rc*

Se você ainda não consegue encontrar nada, então ... Bem, eu admito que estou ficando sem idéias. Você realmente deve dar uma olhada ps -efe localizar processos associados aos programas baseados em Java. Você deve encontrar um daemon, ou um "iniciador", responsável pelo reaparecimento constante do seu processo Java.


Eu tentei procurar o processo pai, mas apenas aponta para init (PPID = 1). Modificarei a pergunta com esta informação.
22414 Jose

@ JosephChavez, se o seu PPID for 1, os processos java que estão sendo criados são processos zumbis. Verifique esta resposta aqui .
Ramsh

@JoseChavez Editei minha resposta com mais algumas faixas para investigar no seu caso.
John WH Smith

2
@Ramesh Se o PPID for 1, eles podem ou não ser zumbis . Se eles não foram realmente criados init, eles são pelo menos órfãos . O stateespecificador para psmostrará se eles são zumbis (por exemplo, ps -eo pid,ppid,state,comm); o estado será Z.
precisa

1
@goldilocks: se o PPID é 1, eles não são zumbis , a menos que o processo de inicialização esteja com defeito; deve executar um loop de espera que colha todos os zumbis órfãos imediatamente.
hmakholm deixou Monica em 22/10

1

Se você não sabe quem é o pai, deve rastrear o sistema como auditd

você ativaria o registro com:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

e depois em /var/log/audit/audit.log encontrar linhas como:

type=SYSCALL msg=audit(1414027338.620:6232): arch=c000003e syscall=59
success=yes exit=0 a0=7fdea0e4db23 a1=7fffec7c5220 a2=7fffec7c87d0
a3=7fdea1b559d0 items=2 ppid=17176 pid=18182 auid=1000 uid=1000 gid=1000 
euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 
ses=2 comm="sh" exe="/bin/dash" key=(null)

(dividido em várias linhas para facilitar a leitura). Você está interessado exe="/bin/dash"e / ou pid=18182qual identifica o processo rouge que deseja procurar e ppid=17176qual identifica o pai que o executou.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.