2012-04-02 4 views
0

У меня есть некоторый кодbash scripting. Поиск по шаблону

#!/bin/ksh 
########################################################################## 

$JAVA_HOME/bin/java -jar SocketListener.jar 8182 &  
while[[ ??? ]] do; 
sleep 1 
done 

next_command 

Следующая команда должна быть выполнена после загрузки SocketListener. У меня есть метод GetJavaID() {} , который может получить PID SocketListener. Мне нужно что-то, что можно сравнить с $ (GetJavaID) и шаблоном [0-9] в , а. В цикле while следует проверить: создан ли PID $ (GetJavaID) или нет?

+8

Я не могу не заметить, что вы просите о bash, но запуск вашего скрипта в ksh ... не совсем то же самое! – ams

+1

Во всяком случае, я не понимаю? Если вы уже * знаете * PID, почему вы должны убедиться, что он работает? Либо он работает, либо у него еще нет ПИД-регулятора? – ams

ответ

1

Вы можете сказать

while ! ps -p $(some method that returns the PID you want) 1>/dev/null ; do 
    sleep 1 
done 

ps с -p pid возвратит успех, если ФИД матчи и неудачи в противном случае.

+0

Вы также можете проверить идентификатор процесса с помощью 'kill -n 0 $ PID', который позволяет избежать внешних команд. – Idelic

+0

@Idelic: Какие внешние команды? Конечно, вы не имеете в виду 'ps'. Проситель знает PID только, выполнив некоторую команду, поэтому я включил этот факт в решение. Заменив приведенное выше на 'while kill -n 0 $ (...); do' не сильно отличается – Sorpigal

+0

Это отличается тем, что он не запускает внешние команды. И я имею в виду 'ps'. – Idelic

-1

команда PS для получения списка всех PID запущенного процесса и grep для PID. Количество выходных данных должно быть больше одного, чтобы гарантировать, что PID запущен (Grepping PID будет одним процессом, указанным на выходе, поэтому мы проверяем более одного вывода). Используйте команду wc для получения количества выходных данных. Таким образом, команда будет

result=`ps axu | grep -c $(GerJavaID)` #-c will make it to return number of output lines 
if [ $result -gt 1 ] 
then 
    echo "Process Running" 
fi 
+0

Мой метод GerJavaID() получает PID с помощью команды ps psus | grep ' – Ilya

+0

, то просто увеличьте его до wc – ganesshkumar

+0

У этого есть несколько классических антивирусных скриптов, которые не делают этого. http://partmaps.org/era/unix/award.html – tripleee

0

вы можете получить PID «последней выполненной фоновой (асинхронной) команды», используя «$!»

так это должно сделать трюк:

$JAVA_HOME/bin/java -jar SocketListener.jar 8182 & 
JAVAPID=$! 
while ps -p ${JAVAPID} > /dev/null 
do 
    sleep 1 
done 
echo "done" 

я перенаправить вывод «PS» в/DEV/нуль, чтобы избежать выхода ненужным.

кроме этого я не понимаю, почему вам нужно выполнить фоновый процесс только для того, чтобы дождаться его потом. следующие должны быть эквивалентны:

$JAVA_HOME/bin/java -jar SocketListener.jar 8182 
echo "done" 

если, конечно, вы хотите сделать что-то большее между началом обработке и печати «сделано».

0

Греческая вики на помощь. В Process Management:

kill -0 $PID будет проверять, находится ли сигнал доставки (т.е. , процесс все еще существует). Если вам нужно проверить один дочерний процесс асинхронно, это самое портативное решение. Вы также можете использовать команду оболочки wait для блокировки, пока ребенок (или дети) не завершится - это зависит от того, что должна делать ваша программа.

И

Там нет такого понятия, как «демон запускается успешно», и если ваш конкретный демон должны были иметь соответствующее определение к этому заявлению, было бы настолько демон конкретных , что у нас нет общего способа рассказать вам, как проверить это условие.

Я не понимаю, почему вы приняли решение, которое вы сделали. Во-первых, если вы хотите дождаться завершения процесса до , то завершите работу, нет необходимости его заполнять.И while ! ps -p $PID будет работать, пока процесс не завершится (так же, как намного проще wait будет делать), так что все сводится к одной линии:

$JAVA_HOME/bin/java -jar SocketListener.jar 8182