Como encontrar a fonte do processo de desova?

11

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

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

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

Alguma ideia de como posso descobrir a fonte?

    
por Jose Chavez 22.10.2014 / 16:26

4 respostas

15

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

  1. Um cronjob de sistema ou usuário sendo executado com frequência,
  2. No init do SysV, uma entrada /etc/inittab para o serviço com a diretiva respawn ,
  3. No systemd, um arquivo de unidade com a opção Restart definida como um valor diferente de no ,
  4. No Upstart, um arquivo de configuração de serviço com a diretiva respawn ,
  5. Uma ferramenta de monitoramento de processos, como monit , ou
  6. Um processo de watchdog ad-hoc para esse serviço específico.

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

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

Por exemplo, se eu quisesse ver cada processo iniciando ls , posso emitir:

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

Quando ls é executado em algum lugar, recebo 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=...

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

    
por 22.10.2014 / 18:00
7

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

pstree -p PID

O item acima lhe dará uma lista de todos os pais dos aplicativos java.

    
por 22.10.2014 / 16:35
4

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

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

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

$ ps -p [PPID]

Editar : se o pai é 1 (init), então o pai primeiro do seu processo Java morreu logo após o "parto" (quão triste). Por causa disso, você não pode 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 no 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? Dang isso. Vamos tentar outra coisa. Se o seu processo Java estiver presente desde a inicialização, dê uma olhada nos programas concluídos 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 ideias. Você deve realmente dar outra olhada em ps -ef e localizar processos associados a programas baseados em Java. Você deve se deparar com um daemon, ou um "lançador", responsável pelo respawn constante de seu processo Java.

    
por 22.10.2014 / 16:36
1

Se você não sabe quem é o pai / mãe, você deve usar algum rastreador de sistema como auditar

você ativaria o registro em:

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

e, em seguida, em /var/log/audit/audit.log , encontre 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 em exe="/bin/dash" e / ou pid=18182 que identificam seu processo de rouge que você deseja procurar e ppid=17176 que identifica pai que o executou.

    
por 23.10.2014 / 03:29

Tags