Как распечатать трассировку стека потока (с идентификатором потока) с помощью команды bash?

Я бы попытался отслеживать действие, выполняемое в потоке, например команду tail. И он должен напечатать stackTrace потока (чей идентификатор потока известен).

Я мог бы распечатать трассировку стека всех потоков, которые в настоящее время выполняются в процессе java, как показано ниже.

pid=$(ps -ef |grep 'catalina' | grep java | awk ' { print $2 } ');
eval '/home/jdk/bin/jstack -F $pid' > stack_trace.txt

Но мне нужно напечатать трассировку стека потока, идентификатор потока которого известен.

Любая помощь в этом отношении приветствуется. Заранее спасибо :)


person Community    schedule 01.10.2017    source источник
comment
Ну, я бы предположил, что у вас уже есть нужная вам информация в файле stack_trace.txt, так что копайте еще немного, и тогда вы получите ответ :)   -  person Krassi Em    schedule 03.10.2017
comment
@KrassiEm Он уже доступен в этом файле. Но количество активных потоков слишком велико - он просто получает все потоки, которые в настоящее время выполняются в процессе java... Итак, было бы большим облегчением, если бы я мог получить только трассировку стека текущего потока или трассировку стека в реальном времени (что-то вроде хвоста) - происходят активные изменения.   -  person    schedule 03.10.2017
comment
Можете ли вы опубликовать образец файла на github, только если вам это разрешено. Кажется, что когда файл есть, следует использовать некоторый анализ регулярных выражений, чтобы извлечь то, что вам нужно. Я уверен, что какой-то код grep, awk, perl находится в шаге от решения.   -  person Krassi Em    schedule 03.10.2017


Ответы (1)


Можете ли вы попробовать посмотреть, работает ли ниже для вас.

TARGET_THREAD_ID=xxx JAVA_PID=$(ps -ef | grep "[org].apache.catalina.startup.Bootstrap"  | awk '{print $2}'); jstack -F ${JAVA_PID} | sed -n -e "/Thread ${TARGET_THREAD_ID}/,/Thread /p" | head -n -1

Который напечатает что-то вроде ниже

Thread xxx: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.Object.wait() @bci=2, line=502 (Compiled frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Compiled frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Compiled frame)
person giddi    schedule 01.06.2018