如何在shell脚本中运行时启用某些命令

时间:2014-11-26 09:13:17

标签: linux bash shell awk

我编写了1个shell脚本来为特定的进程ID(PID)运行Jstack命令。

但有时可能会发生服务器中有多个PID用于Java进程。

在这种情况下,我想运行那么多Jstack命令,将各自的PID作为命令的输入。

EG。如果一个应用程序有2个服务器(1个tomcat和1个jboss),那么我需要运行2个JStack命令来为2个进程捕获2个不同的日志。

那么如何处理或检查脚本会自动决定java进程有多少PID,并运行脚本中写的命令?

我的脚本正在通过

激活所有PID
PID1=$(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 &

2 个答案:

答案 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