A volte, ho un processo Java canaglia che occupa il 100% della mia CPU e la fa saltare di circa 30°C di temperatura (di solito provocando un arresto anomalo se non viene ucciso).
Il problema è che non riesco mai a identificarlo (ha una lunga lista di parametri e cose) o ad analizzarlo perché devo eliminarlo così in fretta.
C'è una sorta di registro che posso guardare per vedere l'identità dei processi passati che ho ucciso? In caso contrario, c'è un modo per me di catturare quel processo la prossima volta che si presenta?
Se importa, sono OpenSuse 11.4.
Risposta accettata:
No, non per impostazione predefinita. Esiste una cosa come troppa registrazione (soprattutto quando inizi a rischiare di registrare l'azione di scrivere una voce di registro...).
Contabilità del processo BSD (se ce l'hai, esegui lastcomm
), se attivo, registra il nome di ogni comando eseguito e alcune statistiche di base, ma non gli argomenti.
Il sottosistema di audit è più generale e più flessibile. Installa il audit
pacchetto e leggi la guida all'audit di SuSE (principalmente la parte sulle regole), oppure prova
auditctl -A exit,always -F path=/usr/bin/java -S execve
Oppure:invece di ucciderlo, kill -STOP
esso. Lo STOP sospende il processo, senza fare domande. Hai la possibilità di riprendere (kill -CONT
) o terminare (kill -KILL
) dopo. Finché il processo è ancora attivo, puoi ispezionarne la riga di comando (/proc/12345/cmdline
), la sua mappa di memoria (/proc/12345/maps
) e così via.
Oppure:allega un debugger al processo e mettilo in pausa. È semplice come gdb --pid 12345
(potrebbero esserci opzioni migliori per un processo Java); il collegamento di un debugger interrompe immediatamente il processo (se esci dal debugger, il processo riceve un SIGCONT e riprende).
Nota che tutto ciò cattura solo i processi a livello di sistema operativo, non i thread JVM. Devi passare alle funzionalità JVM per eseguire il debug dei thread.