arthas 管道命令没有在stat统计数据中

iq0todco  于 2021-11-28  发布在  Java
关注(0)|答案(7)|浏览(294)

比如 sysprop | grep java ,只统计到 sysprop

idfiyjo8

idfiyjo81#

您好,我测试了下,管道是起作用的,请看看:

wgmfuz8q

wgmfuz8q2#

@Roger3581321 管道是工作的,这里指的是 回报服务里,没有统计到管道后面的命令

x3naxklr

x3naxklr3#

好的,我再调查一下。

whitzsjs

whitzsjs4#

首先排除了api接收错误的问题

那么应该是获取 command 的问题.
果然...

因为命令 是 process (com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessImpl) , process 和 管道符是分开处理的
JobControllerImpl.java

arthas/core/src/main/java/com/taobao/arthas/core/shell/system/impl/JobControllerImpl.java

Lines 186 to 190 in 7332033

| | if (isPipeline) { |
| | pipelineTokens.add(remainingToken); |
| | } else { |
| | remaining.add(remainingToken); |
| | } |

process args 携带的值, 例如
[arthas@pid]$ jad --source-only com.example.demo.HelloController
那么

  • name() : jad

  • process.args(): [ "--source-only", "com.example.demo.HelloController"]

  • process.commandLine().allArguments();

  • process.argsTokens();

似乎都满足不了需求

我觉得可行的方法有

  1. history文件里直接拿 里拿数据 , 直接拿第一条就行了 但是多人同时操作的时候可能会有问题

  1. term 里拿 ((TermImpl) term).getReadline().getHistory() , 其实这个也是从 history想到的...

@hengyunabc 你觉得呢

flvtvl50

flvtvl505#

@Huangxuny1 不能依赖term的数据,马上要合并http api分支了。我印象中有一个通过CliToken还原命令的方法,请跟踪一下 :
com.taobao.arthas.core.shell.system.Job#line()
com.taobao.arthas.core.shell.system.impl.JobControllerImpl#createJob()

s8vozzvw

s8vozzvw6#

这个我昨晚也注意到了 的确能够从 Job 中拿到 line 但是从调试器来看
process -> this.$0 (ProcessImpl) -> terminateHandler -> this.$0( JobImpl) 才能拿到 line
有不有其他简单方法拿到我还需要抽时间看看源码

4uqofj5v

4uqofj5v7#

要按照正常的方式去获取依赖的对象,不能用外部工程的方式。
可以在com.taobao.arthas.core.shell.system.impl.JobImpl#JobImpl() 构造方法中向process传入job对象引用。

JobImpl(int id, final JobControllerImpl controller, Process process, String line, boolean runInBackground, ShellImpl shell) {
    // ....
    process.setJob(this);
    process.terminatedHandler(new TerminatedHandler(controller));
}

相关问题