我编写了1个shell脚本来为特定的进程ID(PID)运行Jstack命令。
但有时可能会发生服务器中有多个PID用于Java进程。
在这种情况下,我想运行那么多Jstack命令,将各自的PID作为命令的输入。
EG。如果一个应用程序有2个服务器(1个tomcat和1个jboss),那么我需要运行2个JStack命令来为2个进程捕获2个不同的日志。
那么如何处理或检查脚本会自动决定java进程有多少PID,并运行脚本中写的命令?
我的脚本正在通过
激活所有PIDPID1=$(ps -ef|grep java|grep jboss| awk '{print $2}' )
和
PID2=$(ps -ef|grep java|grep tomcat| awk '{print $2}' )
之后我正在运行Jstack命令
jstack $PID1 > jStack1.txt & and jstack $PID2 > jStack2.txt &
答案 0 :(得分:0)
你需要将pids组合成一个列表并循环它们。
所以像这样为每个pid获取一个单独的文件:
for pid in $( ps -ef | egrep "tomcat|jboss" | awk '{print $2}')
do
jstack $pid > jstack.$pid.txt
done
继续上一次评论
我不确定你要对数组和循环中的多个jstack调用做什么,因为它将为每个pid迭代一次,而不是在循环中给你两个pid,以及$ 0& $ 1指数没有意义(你的意思是0和1?),你每次都使用$ N但是它的增量被注释掉,所以保持为0。
如果您确定只有两个pid,一个用于tomcat,一个用于jboss,那么添加了睡眠的初始代码就可以了:
#!/bin/bash
Sleep1=$1
# sleep for the first requested time
sleep $Sleep1
# do the tomcat jstack
PID1=$(ps -ef | grep java| grep tomcat | awk '{print $2}')
jstack $PID1 > jstack.tomcat.$PID1.txt
# sleep for another 60secs
sleep 60
# do the jboss jstack
PID2=$(ps -ef | grep java| egrep "jboss|JBoss" | awk '{print $2}')
jstack $PID2 > jstack.jboss.$PID1.txt
如果可以有多个tomcat进程和多个jboss进程,那么你需要两个循环:
#!/bin/bash
Sleep1 = $1
# sleep for the first requested time
sleep = $Sleep1
# Do all the tomcat jstacks
for pid in $(ps -ef | grep java| grep "tomcat" | awk '{print $2}')
do
jstack $pid > jstack.tomcat.${pid}.txt )
done
# sleep for another 60secs
sleep 60
# Do all the jboss jstacks
for pid in $(ps -ef | grep java| egrep "jboss|JBoss" | awk '{print $2}')
do
jstack $pid > jstack.jboss.${pid}.txt )
done
或者可以使用这些方法的某些组合,具体取决于您的目标。
答案 1 :(得分:0)
要获得pid,您可以使用pgrep
代替ps/grep/grep/awk
:
for pid in $(pgrep -f "tomcat|jboss")
do
jstack $pid >> jStack1.txt
done