2012-04-02 119 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 2012-04-02 12:31:52

+1

无论如何,我不明白吗?如果你已经知道PID,为什么你必须看看它是否在运行?要么它正在运行,要么它还没有PID呢? – ams 2012-04-02 12:37:42

回答

1

你可以说

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

ps-p pid将返回成功,如果一个PID比赛,否则失败。

+0

您还可以使用'kill -n 0 $ PID'来验证进程标识,这可以避免外部命令。 – Idelic 2012-04-02 17:45:31

+0

@Idelic:什么外部命令?当然你不是指'ps'。请求者只通过运行一些命令就知道PID,所以我将这个事实结合到解决方案中。用'while kill -n 0 $(...)替换上面的内容;做'没有太大的不同 – Sorpigal 2012-04-02 17:51:22

+0

它不同于它不运行外部命令。我的意思是'ps'。 – Idelic 2012-04-02 17:58:49

-1

使用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 
+0

我的方法GerJavaID()使用命令'ps axu | grep' – Ilya 2012-04-02 11:16:53

+0

然后只是扩展到wc – ganesshkumar 2012-04-02 12:15:11

+0

这有几个经典的“不这样做”shell脚本反模式。 http://partmaps.org/era/unix/award.html – tripleee 2012-04-02 16:47:26

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" 

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

0

Greg的维基解救。在Process Management

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

而且

有没有这样的事情“守护成功启动”,如果您的具体守护进程是有相关的定义,这一声明,这将是如此彻底守护专用,我们没有通用的方式告诉你如何检查这种情况。

我不明白你为什么接受你所做的解决方案。首先,如果您想等待的流程终止,则无需将其背景化。而while ! ps -p $PID将运行,直到进程终止(就像要简单得多wait会做),那么这一切都归结为一条直线:

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