Skip to content

Commit c5d2b9c

Browse files
committed
如果Java进程的用户 与 执行脚本的当前用户 不同,提示用户使用sudo再执行
这样可以避免在脚本做的sudo操作,需要用户输入,而Block脚本。 在服务器上脚本自动执行,不Block的特点很重要。
1 parent 7ddc8bc commit c5d2b9c

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ source <(curl -fsSL https://raw.githubusercontent.com/oldratlee/useful-scripts/m
2121

2222
1. [show-busy-java-threads.sh](docs/java.md#beer-show-busy-java-threadssh)
2323
打印出在运行的`Java`进程中,消耗`CPU`最多的线程栈。用于快速排查`Java`的性能问题。
24-
如果执行脚本的用户不是root,需要前面加上sudo
2524
1. [show-duplicate-java-classes](docs/java.md#beer-show-duplicate-java-classes)
2625
找出`jar`文件和`class`目录中的重复类。用于排查`Java`类冲突问题。
2726
1. [find-in-jars.sh](docs/java.md#beer-find-in-jarssh)

docs/java.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ show-busy-java-threads.sh -c <要显示的线程栈数>
1717
# 上面会从所有的Java进程中找出最消耗CPU的线程,这样用更方便。
1818

1919
show-busy-java-threads.sh -c <要显示的线程栈数> -p <指定的Java Process>
20+
21+
##############################
22+
# 注意:
23+
##############################
24+
# 如果Java进程的用户 与 执行脚本的当前用户 不同,则jstack不了这个Java进程。
25+
# 为了能切换到Java进程的用户,需要加sudo来执行,即可以解决:
26+
sudo show-busy-java-threads.sh
2027
```
2128

2229
### 示例

show-busy-java-threads.sh

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
# @author Jerry Lee
99

1010
readonly PROG=`basename $0`
11+
readonly -a COMMAND_LINE=("$0" "$@")
1112

1213
usage() {
1314
cat <<EOF
@@ -58,6 +59,24 @@ redEcho() {
5859
} || echo "$@"
5960
}
6061

62+
yellowEcho() {
63+
[ -c /dev/stdout ] && {
64+
# if stdout is console, turn on color output.
65+
echo -ne "\033[1;33m"
66+
echo -n "$@"
67+
echo -e "\033[0m"
68+
} || echo "$@"
69+
}
70+
71+
blueEcho() {
72+
[ -c /dev/stdout ] && {
73+
# if stdout is console, turn on color output.
74+
echo -ne "\033[1;36m"
75+
echo -n "$@"
76+
echo -e "\033[0m"
77+
} || echo "$@"
78+
}
79+
6180
# Check the existence of jstack command!
6281
if ! which jstack &> /dev/null; then
6382
[ -z "$JAVA_HOME" ] && {
@@ -96,18 +115,27 @@ printStackOfThread() {
96115

97116
[ ! -f "${jstackFile}" ] && {
98117
{
99-
if [ "${user}" == "${USER}" ];then
118+
if [ "${user}" == "${USER}" ]; then
100119
jstack ${pid} > ${jstackFile}
101120
else
102-
sudo -u ${user} jstack ${pid} > ${jstackFile}
121+
if [ $UID == 0 ]; then
122+
sudo -u ${user} jstack ${pid} > ${jstackFile}
123+
else
124+
redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
125+
redEcho "User of java process($user) is not current user($USER), need sudo to run again:"
126+
yellowEcho " sudo ${COMMAND_LINE[@]}"
127+
echo
128+
continue
129+
fi
103130
fi
104131
} || {
105-
redEcho "Fail to jstack java process ${pid}!"
132+
redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
133+
echo
106134
rm ${jstackFile}
107135
continue
108136
}
109137
}
110-
redEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"
138+
blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"
111139
sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}
112140
done
113141
}

0 commit comments

Comments
 (0)