bash脚本。模式匹配

时间:2012-04-02 09:49:48

标签: bash shell

我有一些代码

#!/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)?

4 个答案:

答案 0 :(得分:1)

你可以说

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

-p pid将在pid匹配时返回成功,否则将失败。

答案 1 :(得分: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 / null以避免不必要的输出。

除此之外,我不明白为什么你需要后台一个进程只是为了等待它。 以下内容应相同:

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

当然,除非你想在开始处理和打印“完成”之间做更多的事情。

答案 2 :(得分:0)

格雷格的拯救维基。在Process Management

  

kill -0 $PID将检查信号是否可交付(即。,该过程仍然存在)。如果您需要异步检查单个子进程,那么这是最便携的解决方案。您也可以使用wait shell命令阻止子项(或子项)终止 - 这取决于您的程序必须执行的操作。

  

没有“守护进程成功启动”这样的事情,如果你的特定守护进程要对该声明有一个相关的定义,它将完全是守护进程特定的,我们没有通用的方法告诉你如何检查这种情况。

我不明白为什么你接受了你所做的解决方案。首先,如果您想等待终止的过程,则无需进行后台处理。并且while ! ps -p $PID将一直运行,直到进程终止(就像更简单的wait那样),所以这一切归结为一行:

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

答案 3 :(得分:-1)

使用PS命令获取所有正在运行的进程的PID列表以及PID的grep。输出的数量必须大于1,以确保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