2010-12-21 58 views
1

我已經將此shell腳本作爲包裝器寫入JAR文件。該腳本毫無問題地啓動JAR,但完成後無需等待JAR完成其工作。該腳本可以等待外部進程完成嗎?

#!/bin/bash 

export WORK=/opt/conversion 
export LOG=$WORK 
export [email protected] 
export JAVA_BASE=/usr/java/jdk1.6.0_06 
export JAVA_HOME=/usr/java/jdk1.6.0_06/bin 
export JAR=$WORK/conversion.jar 
export CLASSPATH=$JAVA_BASE/lib/tools.jar 
export CLASSPATH=$CLASSPATH:$WORK/lib/ojdbc14.jar 
export CLASSPATH=$CLASSPATH:$JAR 

$JAVA_HOME/java -Xms256M -Xmx512M -classpath $CLASSPATH com.myapp.cam.conversion >>$WORK/job.out 2>&1 & 

echo $! > $WORK/job.pid 
mail -s "Conversion" $XMAIL < $WORK/user_message 
exit 0 

有沒有辦法讓腳本在我的JAR文件上等待完成?

感謝您的輸入。

回答

2

你在命令的末尾有一個&

$JAVA_HOME/java -Xms256M -Xmx512M -classpath $CLASSPATH com.myapp.cam.conversion >>$WORK/job.out 2>&1 & 

這使得它在後臺運行。

刪除&以等待java過程完成,然後再繼續執行腳本。

+0

我刪除了&。那就是訣竅。謝謝。 – Chris 2010-12-21 20:05:23

0

不要在後臺運行轉換Java應用程序。或者,重複運行ps,直到您看不到該pid。這可以讓你在等待的時候做些事情。

6

正如其他人所說,刪除&和bash將等待直到命令完成。如果你堅持在後臺運行的過程中,這裏是你能做什麼:

pid=`pidof java` 

if [ "$pid" ]; then 
    while kill -0 "$pid"; do 
     sleep 1 
    done 
fi 

kill命令通常用於將信號發送到特定的過程,但是通過使用0因爲你只檢查信號在沒有發送信號的情況下是否存在具有這種pid的進程。

+0

哪個是最佳做法?等到命令完成或在後臺運行我的進程? – Chris 2010-12-21 20:07:20

1

如果要在後臺運行它,請在腳本末尾添加wait命令。