Manchmal habe ich einen bösartigen Java-Prozess, der 100 % meiner CPU beansprucht und die Temperatur um etwa 30 °C ansteigen lässt (was normalerweise zu einem Absturz führt, wenn er nicht beendet wird).
Das Problem ist, dass ich es nie wirklich identifizieren (es hat eine lange Liste von Parametern und so) oder analysieren kann, weil ich es so schnell töten muss.
Gibt es eine Art Protokoll, das ich mir ansehen kann, um die Identität vergangener Prozesse zu sehen, die ich beendet habe? Wenn nicht, gibt es eine Möglichkeit für mich, diesen Prozess das nächste Mal abzufangen, wenn er auftaucht?
Wenn es darauf ankommt, ich bin OpenSuse 11.4.
Akzeptierte Antwort:
Nein, standardmäßig nicht. Es gibt so etwas wie zu viel Protokollierung (insbesondere wenn Sie riskieren, die Aktion des Schreibens eines Protokolleintrags zu protokollieren …).
BSD-Prozessabrechnung (falls vorhanden, führen Sie lastcomm
aus ), wenn aktiv, zeichnet den Namen jedes ausgeführten Befehls und einige grundlegende Statistiken auf, aber nicht die Argumente.
Das Audit-Subsystem ist allgemeiner und flexibler. Installieren Sie das audit
Paket und lesen Sie den SuSE Audit Guide (hauptsächlich den Teil über Regeln), oder versuchen Sie es
auditctl -A exit,always -F path=/usr/bin/java -S execve
Oder:Anstatt es zu beenden, kill -STOP
es. Der STOP unterbricht den Vorgang, es werden keine Fragen gestellt. Sie erhalten die Option zum Fortsetzen (kill -CONT
) oder beenden (kill -KILL
) später. Solange der Prozess noch läuft, können Sie seine Befehlszeile (/proc/12345/cmdline
), seine Speicherkarte (/proc/12345/maps
) und so weiter.
Oder:Hängen Sie einen Debugger an den Prozess an und halten Sie ihn an. Es ist so einfach wie gdb --pid 12345
(Möglicherweise gibt es bessere Optionen für einen Java-Prozess); Durch das Anhängen eines Debuggers wird der Prozess sofort angehalten (wenn Sie den Debugger beenden, erhält der Prozess ein SIGCONT und wird fortgesetzt).
Beachten Sie, dass all dies nur Prozesse auf Betriebssystemebene erfasst, keine JVM-Threads. Sie müssen sich den JVM-Funktionen zuwenden, um Threads zu debuggen.