bash脚本。模式匹配

bash脚本。模式匹配,bash,shell,Bash,Shell,我有一些密码 #!/bin/ksh ########################################################################## $JAVA_HOME/bin/java -jar SocketListener.jar 8182 & while[[ ??? ]] do; sleep 1 done next_command 加载SocketListener后,必须执行下一个命令。 我有方法GetJavaID(){} 这可以

我有一些密码

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

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

next_command
加载SocketListener后,必须执行下一个命令。 我有方法GetJavaID(){} 这可以得到SocketListener PID。我需要一些可以在while循环中比较$(GetJavaID)和模式[0-9]的东西。
while循环中应该检查:是否创建了PID$(GetJavaID)

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

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

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

您可以使用“$!”获取“最近执行的后台(异步)命令”的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"

当然,除非您想在启动流程和打印“完成”之间做更多的事情。

Greg的wiki来拯救您。在:

kill-0$PID
将检查信号是否可交付(即,流程仍然存在)。如果需要异步检查单个子进程,这是最可移植的解决方案。您还可以使用
wait
shell命令阻止,直到子(或多个子)终止——这取决于您的程序必须执行的操作

没有“守护进程成功启动”这样的事情,如果您的特定守护进程对该语句有相关定义,那么它将是完全特定于守护进程的,因此我们没有通用的方法来告诉您如何检查该条件

我不明白你为什么接受你所做的解决方案。首先,如果要等待进程终止,则无需对其进行后台处理。和
同时!ps-p$PID将一直运行到进程终止(就像更简单的
wait
一样),因此它可以归结为一行:

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

我忍不住注意到您正在询问bash,但在ksh中运行您的脚本。。。不完全一样!不管怎样,我不明白?如果您已经知道PID,为什么要查看它是否正在运行?要么它正在运行,要么它还没有PID,当然?这有几个经典的“不要那样做”shell脚本反模式。我改进了它。仍然可以找到一些反模式?还可以使用
kill-n0$PID
验证进程id,这样可以避免使用外部命令。@Idelic:什么外部命令?你的意思肯定不是说ps。请求者仅通过运行一些命令才知道PID,因此我将这一事实合并到解决方案中。将上述内容替换为
whilekill-n0$(…);do
没有太大区别,不同之处在于它不运行外部命令。我的意思是,
ps
@Idelic:
kill
有时只是一个内置的,它比
ps
更经常是一个内置的,它是
bash
的一个内置的,在问题中被标记。