我有一些代码
#!/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)?
答案 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)
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