Někdy mám nečestný proces Java, který zabírá 100 % mého CPU a jeho teplota vyskočí asi o 30 C (obvykle vede k pádu, pokud není zabit).
Problém je v tom, že to nikdy nedokážu identifikovat (má dlouhý seznam parametrů a podobně) nebo to analyzovat, protože to musím tak rychle zabít.
Existuje nějaký protokol, do kterého bych se mohl podívat, abych zjistil identitu minulých procesů, které jsem zabil? Pokud ne, existuje způsob, jak tento proces zachytit, až se příště objeví?
Pokud na tom záleží, mám OpenSuse 11.4.
Přijatá odpověď:
Ne, standardně ne. Existuje něco jako příliš mnoho protokolování (zejména když začnete riskovat protokolování při zápisu záznamu do protokolu…).
BSD procesní účtování (pokud jej máte, spusťte lastcomm
), pokud je aktivní, zaznamenává název každého provedeného příkazu a některé základní statistiky, nikoli však argumenty.
Subsystém auditu je obecnější a flexibilnější. Nainstalujte audit
balíček a přečtěte si průvodce auditem SuSE (většinou část o pravidlech), nebo zkuste
auditctl -A exit,always -F path=/usr/bin/java -S execve
Nebo:místo jeho zabití kill -STOP
to. STOP pozastaví proces, žádné otázky. Získáte možnost pokračovat (kill -CONT
) nebo ukončit (kill -KILL
) později. Dokud proces stále probíhá, můžete zkontrolovat jeho příkazový řádek (/proc/12345/cmdline
), jeho paměťovou mapu (/proc/12345/maps
) a tak dále.
Nebo:připojte k procesu debugger a pozastavte jej. Je to stejně jednoduché jako gdb --pid 12345
(mohou existovat lepší možnosti pro proces Java); připojení ladicího programu okamžitě pozastaví proces (pokud ladicí program ukončíte, proces obdrží SIGCONT a bude pokračovat).
Všimněte si, že to vše zachycuje pouze procesy na úrovni operačního systému, nikoli vlákna JVM. Chcete-li ladit vlákna, musíte se obrátit na funkce JVM.