此脚本可以等待外部进程完成吗?

时间:2010-12-21 19:42:22

标签: bash shell wait

我已将此shell脚本编写为JAR文件的包装器。该脚本可以毫无问题地启动JAR,但无需等待JAR完成其工作即可完成。

#!/bin/bash

export WORK=/opt/conversion
export LOG=$WORK
export XMAIL=me@email.com
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文件完成?

感谢您的意见。

4 个答案:

答案 0 :(得分:6)

正如其他人所说,删除&并且bash会等到命令完成。如果您坚持在后台运行您的流程,您可以执行以下操作:

pid=`pidof java`

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

kill命令通常用于向特定进程发送信号,但通过使用0作为信号,您只需检查具有此类pid的进程是否存在而不发送信号。< / p>

答案 1 :(得分:2)

命令末尾有&

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

使它在后台运行。

删除&以等待java进程完成,然后再继续编写脚本。

答案 2 :(得分:1)

如果要在后台运行它,请在脚本末尾添加wait命令。

答案 3 :(得分:0)

不要在后台运行转换Java应用程序。或者,反复运行ps,直到看不到pid为止。这样你就可以在等待的时候做点什么。