增加对非root用户启动的JVM的支持 - #50
Conversation
如果是非root用户启动的JVM,使用这个脚本会报错 3031: well-known file is not secure Fail to jstack java process 3031!
|
👍 我看看! |
There was a problem hiding this comment.
我在 x86_64 的机器上测试了, 并不需要 jstack 命令上 加上 -J-d64 选项。
@liuyangc3 你不加这个选项 碰到的问题是什么?给一下相关的信息 :)
There was a problem hiding this comment.
我测试的时候也发现确实不需要这个选项,oracle官方doc上指出在64位系统上可能需要指定这个参参数,这里确实画蛇添足了
这里我有个疑问 假设系统上有2个jvm进程 如果使用root 运行jstack 是不能attach tomcat用户的进程的 那么在不指定pid运行脚本的形况下 那么sudo -u tomact 放在脚本外面 jstack无法 attach root的进程 所以我觉得是不是应该在脚本内部去判断每个进程的 user |
假设当前系统上有3个JVM进程 ``` pid1 userA pid2 userB pid3 userC ``` cpu 使用率可能是这样的情况 ``` pid1 tid11 userA 30.0 pid1 tid12 userA 15.0 pid2 tid13 userB 10.0 pid3 tid14 9.0 ``` 按照之前的脚本方式 1 如果是root用户直接执行 show-busy-java-threads.sh 是不行的‘ 2 如果 sudo -u userA show-busy-java-threads.sh 那么 userB userC的jstack的信息是取不到的 所以只能把sudo -u user 放在脚本里判断 如果是非root用户执行这个脚本,必须 sudo show-busy-java-threads.sh
如你所说,因为root用户也不能jstack其它用户的Java进程,要在脚本切换用户。 多谢你的建议和测试! 👍 反馈你晚了,不好意思~ PS: 更多中间的讨论 参见 提交中的评论讨论 |
|
改了一下脚本实现, 如果Java进程的用户 与 执行脚本的当前用户 不同,提示用户使用sudo再执行,不在脚本直接切换。 原因是: 避免在脚本做的sudo操作,需要用户输入root密码,而Block脚本(有卡死自动化系统的风险)。 对于 用户 手动执行的情况,显式地提示 给出了重新运行的命令行,使用便利些: $ ./show-busy-java-threads.sh -c 6
[1] Busy(0.8%) thread(13706/0x358a) stack of java process(13705) under user(jerry):
"main" prio=10 tid=0x00007fc87c009000 nid=0x358a waiting on condition [0x00007fc882942000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Hello.main(Hello.java:3)
[2] Fail to jstack Busy(0.7%) thread(13696/0x3580) stack of java process(13695) under user(root).
User of java process(root) is not current user(jerry), need sudo to run again:
sudo ./show-busy-java-threads.sh -c 6 # 显式地提示 给出了重新运行的命令行
....见提交 c5d2b9c |
|
cool |
|
awesome ! |

如果是非root用户启动的JVM,使用这个脚本会报错