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?

Jose
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).

Steven D
fonte
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.

Ramesh
fonte
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.

John WH Smith
fonte
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.

Matija Nalis
fonte