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
的一个内置的,在问题中被标记。