Wie finde ich die Quelle des Laichprozesses?

12

Ich habe einen Java-Prozess, der auf einer RedHat Linux-Instanz ausgeführt wird.

Das Problem ist, dass es immer wieder auftaucht, nachdem ich es getötet habe. Ich bin nicht sicher, wo ich suchen soll. Ich bin schon zur Crontab gegangen, aber kein Glück.

Ich habe mir die PPID angesehen, aber sie zeigt auf init (1).

Irgendeine Idee, wie ich die Quelle herausfinden kann?

Jose
quelle
1
Können Sie uns etwas zum Weitermachen geben? Schreibt der Prozess beispielsweise in Dateien? Können Sie uns die Ausgabe des ps xfProzessbaums anzeigen? So wie es aussieht, haben wir sehr wenig zu tun.
Terdon
Du hast gesagt, du bist zu Crontab gegangen ... Hast du auch nachgesehen at, ob einer von denen derjenige ist?
YoMismo
Können Sie uns sagen, welche Java-Software Sie gerade ausführen? Ich habe Tools wie Cassandra gesehen, die in bestimmten Setups einen eingebauten Watchdog haben, der nur eine andere Instanz der Datenbank startet, wenn die erste Instanz fehlgeschlagen ist (nicht ordnungsgemäß gestoppt wurde).
Matthias Steinbauer

Antworten:

15

Es gibt eine Reihe von Möglichkeiten (einige werden in anderen Antworten erwähnt):

  1. Ein System- oder Benutzer-Cronjob, der häufig ausgeführt wird,
  2. In SysV init ein /etc/inittabEintrag für den Dienst mit der respawnDirektive,
  3. In systemd wird eine Unit-Datei mit der RestartOption auf einen anderen Wert als " no," gesetzt.
  4. In Upstart eine Dienstkonfigurationsdatei mit der respawnDirektive,
  5. Ein Prozessüberwachungstool wie z. B. monitoder
  6. Ein Ad-hoc-Überwachungsprozess für diesen bestimmten Dienst.

Sysdig ist ein interessantes neues Tool (nur für Linux), mit dem Sie einen genaueren Einblick erhalten, wo der Prozess gestartet wird .

Sysdig nutzt die Tracepoint-Funktionen des Linux-Kernels, um eine schnelle, systemweite Bereitstellung zu ermöglichen strace.

Wenn ich zum Beispiel möchte, dass jeder Prozess startet ls, kann ich Folgendes ausgeben:

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

Wenn lsirgendwo ausgeführt wird, erhalte ich eine Nachricht wie diese:

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

Ich habe die zurückgegebenen Umgebungsinformationen abgeschnitten, aber wie Sie sehen, kann ich in der ptid den Namen und die pid des Programms sehen, das execve aufruft. execvewird der in Linux verwendete Systemaufruf zum Ausführen neuer Befehle verwendet (alle anderen exec-Aufrufe sind nur Frontends zum Ausführen).

Steven D
quelle
2
sysdig ist ein toller rat! Übrigens ist es jetzt für Windows (und Mac, glaube ich) mit eingeschränkter Funktionalität verfügbar.
Neowizard
Wie hilft monit hier? Ich habe angefangen, das Handbuch durchzulesen, aber es scheint eine Alternative oder ein Backup zu Nagios zu sein. Ich verstehe nicht, wie es Ihnen helfen würde, einen Wiederaufwachungsprozess aufzuspüren.
Jefferson Hudson
7

Ich glaube, du könntest es gebrauchen pstree. Sie können den Befehl wie folgt angeben:

pstree -p PID

Oben finden Sie eine Liste aller übergeordneten Java-Anwendungen.

Ramesh
quelle
1
Dies wird überhaupt nicht helfen, wie das OP bereits sagte, er hat sich die PPID angesehen, die 1 ist.
Guntram Blohm unterstützt Monica
@GuntramBlohm, bitte schauen Sie sich die ursprüngliche Frage an, bevor sie bearbeitet wurde. Es wurde in der ersten Version der Frage nicht erwähnt.
Ramesh
2
Seufzer. Ein weiteres Poster, das seine Frage zu einem beweglichen Ziel macht, ohne seine Änderungen zu markieren :(
Guntram Blohm unterstützt Monica
5

Sie können sich die PPID (übergeordnete Prozess-ID) ansehen:

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

Wenn Sie die PPID (zweite Spalte) Ihres Java-Prozesses erhalten haben, pssuchen Sie den zugehörigen Prozess erneut mit:

$ ps -p [PPID]

Bearbeiten : Wenn das übergeordnete Element 1 (init) ist, ist das erste übergeordnete Element Ihres Java-Prozesses direkt nach der "Geburt" (wie traurig) verstorben. Aus diesem Grund können Sie die aktuelle Prozesshierarchie nicht verwenden, um sie zu finden. Das erste, was ich Ihnen empfehlen würde, ist zu überprüfen ps -ef. Sie können den Täter finden, indem Sie einfach die Ausgabe lesen.

Dann schauen Sie sich Crontabs an (Sie haben es bereits getan, aber es tut nicht weh):

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

Dies erfordert Root-Rechte.

Sie können einen geplanten Java-Prozess immer noch nicht sehen? Verdammt noch mal. Versuchen wir etwas anderes. Wenn Ihr Java-Prozess seit dem Start vorhanden ist, schauen Sie sich die Programme an, die zum Startzeitpunkt erstellt wurden. Ich würde so etwas vorschlagen ...

$ grep -iR java /etc/rc*

Wenn Sie dann immer noch nichts finden können ... Nun, ich gebe zu, mir gehen die Ideen aus. Sie sollten sich die ps -efmit Java-basierten Programmen verbundenen Prozesse wirklich genauer ansehen und sie suchen . Sie sollten auf einen Daemon oder einen "Launcher" stoßen, der für das ständige Auffrischen Ihres Java-Prozesses verantwortlich ist.

John WH Smith
quelle
Ich habe versucht, den übergeordneten Prozess nachzuschlagen, aber er zeigt nur auf init (PPID = 1). Ich werde Frage mit dieser Info ändern.
Jose
@ JoseChavez, wenn Ihre PPID 1 ist, dann sind die Java-Prozesse, die erstellt werden, Zombie-Prozesse. Überprüfen Sie diese Antwort hier .
Ramesh
@ JoseChavez Ich habe meine Antwort mit ein paar weiteren Spuren bearbeitet, um Ihren Fall zu untersuchen.
John WH Smith
2
@Ramesh Wenn die PPID 1 ist, können sie Zombies sein oder nicht . Wenn sie nicht tatsächlich hervorgebracht wurden init, sind sie zumindest Waisen . Der stateSpezifizierer, psder zeigt, ob es sich um Zombies handelt (zB ps -eo pid,ppid,state,comm); der Staat wird sein Z.
Goldlöckchen
1
@goldilocks: Wenn die PPID 1 ist, sind sie keine Zombies , es sei denn, der Init-Prozess funktioniert nicht ordnungsgemäß . es sollte eine Warteschleife laufen, die alle verwaisten Zombies sofort erntet.
hmakholm hat Monica
1

Wenn Sie nicht wissen, wer das übergeordnete Element ist, sollten Sie einen System-Tracer wie auditd verwenden

Sie aktivieren die Protokollierung mit:

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

und dann in /var/log/audit/audit.logfind Zeilen wie:

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)

(Zur besseren Lesbarkeit in mehrere Zeilen unterteilt). Sie interessieren sich für exe="/bin/dash"und / oder pid=18182identifizieren Ihren Rouge-Prozess, nach dem Sie suchen möchten, und ppid=17176identifizieren die Eltern, die ihn ausgeführt haben.

Matija Nalis
quelle