Come trovare la fonte del processo di generazione?


12

Ho un processo Java in esecuzione su un'istanza di RedHat Linux.

Il problema è che riappare dopo che l'ho ucciso. Non sono sicuro di dove cercare. Sono già andato a crontab, ma senza fortuna.

Ho esaminato il PPID, ma punta a init (1).

Qualche idea su come posso scoprire la fonte?


1
Puoi darci qualcosa per continuare? Ad esempio, il processo scrive su qualche file? Puoi mostrarci l'output di ps xfmostrare l'albero dei processi? Allo stato attuale, abbiamo ben poco da fare.
terdon

Hai detto che sei andato su crontab ... Hai anche controllato atper vedere se qualcuno di questi è quello?
YoMismo,

Puoi dirci quale software Java stai effettivamente eseguendo. Ho visto strumenti come Cassandra, che in realtà hanno un watchdog integrato in alcune configurazioni che si accende solo un'altra istanza del database una volta che la prima istanza ha avuto esito negativo (non è stata arrestata con grazia).
Matthias Steinbauer,

Risposte:


15

Esistono diverse possibilità (alcune citate in altre risposte):

  1. Un cronjob di sistema o utente in esecuzione spesso,
  2. In SysV init, una /etc/inittabvoce per il servizio con la respawndirettiva,
  3. In systemd, un file di unità con l' Restartopzione impostata su un valore diverso da no,
  4. In Upstart, un file di configurazione del servizio con la respawndirettiva,
  5. Uno strumento di monitoraggio del processo come monit, o
  6. Un processo di controllo ad-hoc per quel particolare servizio.

Un nuovo strumento interessante (solo Linux) che potrebbe fornire maggiori informazioni su dove viene avviato il processo è sysdig .

Sysdig utilizza le funzionalità tracepoint del kernel Linux per fornire ciò che equivale a un sistema veloce e completo strace.

Ad esempio, se volessi vedere l'avvio di ogni processo ls, posso emettere:

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

Quando lsviene eseguito da qualche parte, riceverò un messaggio come questo:

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=...

Ho troncato le informazioni sull'ambiente restituite, ma come puoi vedere, nel ptid posso vedere il nome e il pid del programma che chiama execve. execveè la chiamata di sistema utilizzata in Linux utilizzata per eseguire nuovi comandi (tutte le altre chiamate exec sono solo frontend da eseguire).


2
sysdig è un ottimo consiglio! A proposito, ora è disponibile per Windows (e Mac, credo) con funzionalità limitate.
Neowizard,

In che modo monit aiuta qui? Ho iniziato a leggere il manuale ma sembra un'alternativa o un backup a qualcosa come Nagios. Non vedo come ti aiuterebbe a rintracciare un processo di rigenerazione.
Jefferson Hudson

7

Credo che potresti usare pstree. È possibile specificare il comando come,

pstree -p PID

Quanto sopra ti fornirà un elenco di tutti i genitori delle applicazioni Java.


1
Questo non aiuta affatto, poiché l'OP ha già detto che ha esaminato il PPID, che è 1.
Guntram Blohm supporta Monica il

@GuntramBlohm, per favore guarda la domanda originale prima che fosse modificata. Non è stato menzionato nella prima versione della domanda.
Ramesh,

2
sospiro. Un altro poster che rende la sua domanda un bersaglio mobile senza segnare le sue modifiche :(
Guntram Blohm supporta Monica il

5

Puoi dare un'occhiata al suo PPID (ID processo principale):

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

Una volta ottenuto il PPID (seconda colonna) del processo Java, utilizzare di psnuovo per trovare il processo associato:

$ ps -p [PPID]

Modifica : se il genitore è 1 (init), allora il primo genitore del tuo processo Java è morto subito dopo il "parto" (che tristezza). Per questo motivo, non è possibile utilizzare la gerarchia del processo corrente per trovarla. La prima cosa che ti consiglierei di fare è controllare ps -ef. Potresti trovare il colpevole solo leggendo l'output.

Quindi, dai un'occhiata ai crontab (l'hai già fatto, ma non farà male):

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

Ciò richiederà i privilegi di root.

Non riesci ancora a vedere un processo Java pianificato? Dang it. Proviamo qualcos'altro. Se il tuo processo Java è presente sin dall'avvio, dai un'occhiata ai programmi che sono stati esclusi al momento dell'avvio. Vorrei suggerire qualcosa come ...

$ grep -iR java /etc/rc*

Se ancora non riesci a trovare nulla, allora ... Beh, ammetto che sto finendo le idee. Dovresti davvero dare un'altra occhiata ps -efe individuare i processi associati ai programmi basati su Java. Dovresti imbatterti in un demone, o un "lanciatore", responsabile del costante rilancio del tuo processo Java.


Ho provato a cercare il processo genitore, ma punta solo a init (PPID = 1). Modificherò la domanda con queste informazioni.
Jose,

@JoseChavez, se il tuo PPID è 1, i processi java che vengono creati sono processi zombi. Controlla questa risposta qui .
Ramesh,

@JoseChavez Ho modificato la mia risposta con alcune tracce in più per indagare sul tuo caso.
John WH Smith,

2
@Ramesh Se il PPID è 1, possono o meno essere zombi . Se in realtà non sono stati generati init, sono almeno orfani . Lo statespecificatore psmostrerà se sono zombi (ad es. ps -eo pid,ppid,state,comm); lo stato sarà Z.
Riccioli d'oro

1
@goldilocks: se il PPID è 1, non sono zombi , a meno che il processo di init non funzioni male; dovrebbe eseguire un ciclo di attesa che raccoglie immediatamente tutti gli zombi orfani.
Hmakholm ha lasciato Monica il

1

Se non sai chi è il genitore, dovresti avere qualche tracciante di sistema come auditd

abiliterai la registrazione con:

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

e poi in /var/log/audit/audit.loglinee di ricerca come:

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)

(suddiviso in più righe per leggibilità). Sei interessato exe="/bin/dash"e / o pid=18182quali identificano il tuo processo rouge che desideri cercare e ppid=17176che identifica il genitore che lo ha eseguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.