2012-04-02 116 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