2014-11-26 3 views
0

Я написал 1 сценарий оболочки для запуска команды Jstack для определенного идентификатора процесса (PID).как включить некоторые команды во время выполнения в сценарии оболочки

Но может случиться так, что на сервере для процесса Java есть несколько PID.

В этом случае я хочу запустить много команд Jstack, предоставляющих соответствующие PID в качестве ввода команды.

Например. Если одно приложение имеет 2 сервера (1 tomcat и 1 jboss), мне нужно запустить 2 команды JStack для захвата 2 разных журналов для 2 процессов.

Итак, как обрабатывать или проверять, чтобы сценарий автоматически определял, сколько PIDs там для java-процесса и будут запускать команды, написанные внутри скрипта?

Мой сценарий получает все ИДП активные по

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 & 
+1

Что ваш вопрос? –

+1

В чем проблема с командой? Не совсем ясно, что вы ожидаете. Если вы можете объяснить, что в настоящее время находится с образцом ввода, и то, что вы ожидаете в результате, поможет. – SMA

+0

Я хочу, чтобы скрипт обнаружил, сколько идентификаторов процесса существует для tomcat и jboss, и, соответственно, должна выполняться команда jstack. Если есть только PID1, тогда запускается jstack $ PID1> jStack1.txt &.Если оба PID1 и PID2 есть, тогда jstack $ PID1> jStack1.txt & должен запускаться для PID1 и jstack $ PID2> jStack2.txt и должен запускаться для PID2. – user3627319

ответ

0

вам нужно объединить ИДП в один список и цикл вокруг них.

Так что-то вроде этого, чтобы получить отдельный файл для каждого PID:

for pid in $(ps -ef | egrep "tomcat|jboss" | awk '{print $2}') 
do 
    jstack $pid > jstack.$pid.txt 
done 

Исходя из последнего комментария

я не уверен, что вы пытаетесь сделать с массив и несколько jstack-вызовов в цикле, поскольку он будет повторять один раз для каждого pid, не дает вам двух pids в цикле, а индексы $ 0 & $ 1 не имеют смысла (вы имели в виду только 0?) и вы используете $ N каждый раз но приращение для него закомментирована так останется, как 0.

Если вы уверены, что там может быть только два ИДП, один за котом и один для 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 

Или некоторые комбинации этих методов могут быть использованы в зависимости от того, что вы после этого.

+0

@ dethorpe..Я ваше предложение отлично работает, чтобы получить все PID и запустить команду Jstack. Но есть одна проблема. По команде выше, если есть 2 PID (1 tomcat & 1 jboss), тогда обе команды JStack запускаются одновременно. Но я хочу запустить их в разное время. Когда я даю время сна перед командой Jstack, то и команды Jstack ждут. Например. после получения PID, я хочу, чтобы 1-й Jstack запускал через 60 секунд запуск скрипта и вторую команду Jstack через 120 секунд. Как это сделать? – user3627319

+0

, если я правильно понимаю, вам просто нужно использовать две отдельные петли, одну для процессов jboss, затем другую для tomcat (соответственно изменяйте строку egrep соответственно). Затем положите спит до и между петлями, как вы хотите – dethorpe

+0

Я делаю все в одном цикле. Я чувствую, что 1-я Jstack не включается после 60 секунд 1-й Jstack starts.Code, как: #/бен/Баш Sleep1 = $ 1 Sleep2 = $ (выражение $ Sleep1 + 60) N = 0 ПИД-! в $ (ps -ef | grep java | egrep «tomcat | jboss | JBoss» | awk '{print $ 2}'); сделать testarray [$ N] = "$ PID" (сон Sleep1; jstack $ {testarray [$ 0]}> jstack $ {testarray [$ 0]} TXT..) (сон Sleep1; jstack $ {testarray [$ 1]}> jstack. $ {testarray [$ 1]}. txt) \t #let "N = $ N + 1" сделано – user3627319

0

Чтобы получить идентификатор процесса, вы можете просто использовать pgrep вместо ps/grep/grep/awk:

for pid in $(pgrep -f "tomcat|jboss") 
do 
    jstack $pid >> jStack1.txt 
done 
+0

, я делаю все в одном цикле. Я чувствую, что второй Jstack не включен после 60 секунд первого старта jstack. Код выглядит так: #!/Bin/bash Sleep1 = $ 1 Sleep2 = $ (expr $ Sleep1 + 60) N = 0 для pid в $ (ps -ef | grep java | egrep "tomcat | jboss | JBoss" | awk '{print $ 2}'); do testarray [$ N] = "$ pid" (sleep Sleep1; jstack $ {testarray [$ 0]}> jstack. $ {testarray [$ 0]}. txt) (sleep Sleep1; jstack $ {testarray [$ 1]}> jstack $ {testarray [$ 1]}. txt) #let "N = $ N + 1" сделано – user3627319