2010-12-21 57 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命令。