2012-04-02 22 views
0

パターンマッチング私はいくつかのコードbashスクリプト。

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

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

next_command 

に次のコマンドを持っているがSocketListenerをロードした後、実行する必要があります。 私はメソッドを持っていますGetJavaID(){} これはSocketListener PIDを取得できます。私はで$(GetJavaID)とパターン[0-9]を比較できるものが必要ですが、ループです。 whileループでチェックする必要があります:PID $(GetJavaID)が作成されているかどうか

+8

私はあなたが求めていることに気付いて助けることができませんbashについては、kshでスクリプトを実行しています...全く同じではありません! – ams

+1

とにかく、私はそれを取得しない?あなたが既にPIDを知っているなら、どうしてそれが動いているのを見なければならないのですか?実行中か、それともまだPIDがありませんか? – ams

答えて

1

になります。

+0

プロセスIDを 'kill -n 0 $ PID'で検証することもできます。これは外部コマンドを避けます。 – Idelic

+0

@Idelic:外部コマンドは何ですか?確かにあなたは 'ps'を意味するわけではありません。リクエスターはいくつかのコマンドを実行するだけでPIDを知っているので、その事実をソリューションに組み込みました。上記を 'kill -n 0 $(...);で置き換える。 doはそれほど違いはありません – Sorpigal

+0

外部コマンドを実行しない点が異なります。そして私は 'ps 'を意味します。 – Idelic

-1

実行中のプロセスのPIDとgrepのリストを取得するためにPSコマンドを使用します。出力の数は、PIDが実行されていることを確認するために1より大きくなければなりません(PIDのグレップは出力にリストされた1つのプロセスになるので、複数の出力をチェックします)。 wcコマンドを使用して出力数を取得します。だから、コマンドは、あなたがそれ以外の場合は、PIDが一致し、失敗ならば、成功を返します-p pid

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

psを言うことができ

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()は、 'ps axu | grep ' – Ilya

+0

それからちょうどそれをwcに戻します – ganesshkumar

+0

これは古典的な "do not do that"シェルスクリプトの反パターンのいくつかを持っています。 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" 

私は不必要な出力を回避するためには/ dev/nullに「PS」の出力をリダイレクトします。

私はなぜあなたが後でそれを待つために1つのプロセスをバックグラウンドする必要があるのか​​理解できません。 は次のように同等である必要があります。

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

もちろん、あなたが処理の開始と印刷「完了」とのより多くの何かをしたい、しない限り。

0

グレッグの救助のwiki。 Process Managementで:

kill -0 $PID信号が送達されているかどうかをチェックする(すなわち、プロセスはまだ存在します)。 1つの子プロセスを非同期にチェックする必要がある場合は、これが最も移植性の高いソリューションです。 waitシェルコマンドを使用して、子(または子)が終了するまでブロックすることもできます。これはプログラムが何をするかによって異なります。

そして

「デーモンが正常に起動」、および特定のデーモンはその文に関連する定義を持っているとしたら、それはとても完全デーモン固有なようなものはありませんその状態をチェックする方法を教えてくれる一般的な方法はないということです。

私があなたがした解決策を受け入れた理由を理解できません。まず、のプロセスが終了するのを待つ場合は、を終了します。バックグラウンドは必要ありません。そしてwhile ! ps -p $PIDは、(ちょうどwaitはるかに簡単なようにするだろう)プロセスを終了するまで実行するために起こっていることすべてが単一の行に沸くので:

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