在内部脚本失败后清理外部Bash脚本

时间:2015-12-04 17:11:21

标签: linux bash shell

我在Bash中有一个名为outer-script.sh的文件中的以下方法:

test_service() {
    nohup java -jar target/outer-runner.jar > service.log 2>&1&
    echo $! > runner-process.pid
    ./inner-script.sh
    kill `cat runner-process.pid`
}

inner-script.sh可以抛出exit 1 - set -e中有outer-script.sh,因此如果内部引发exit 1,外部脚本将停止运行。这一切都很好,但在发生故障时它不会调用kill行!

我已尝试添加

trap "{ kill `cat runner-process.pid` }" EXIT

紧接在test_service()的右括号下方,但如果发生故障,我会收到错误

./outer-script.sh: exit trap: line 2: syntax error: unexpected end of file

并且该过程未被杀死,因此我怀疑这不是正确的语法。我已经尝试过其他几个教程中使用的语法,但令人惊讶的是没有一个特别清楚。

inner-script.shexit 1一起返回时,确保流程被终止的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

不使用Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/hadoop/MongoInputFormat at SimpleApp.main(SimpleApp.java:18) ,而是使用以下语法:

set -e

如果inner-script.sh失败,它将执行./inner-script.sh || { kill `cat runner-process.pid`; exit 1; } 的左手表达,杀死并退出。

答案 1 :(得分:1)

尝试

trap '{ kill $(< runner-process.pid) ; }' EXIT

我不确定你需要单引号VS dbl-quotes,但我通常喜欢使用单引号来消除一些评估顺序问题。

无论何时创建流程组{ ... ; }(在{}内),您需要在结束;字符之前终止}

使用$(< pidFile)是一种更有效的速记,用于抓取文件内容。想想<通常会做什么。同样在这里。

$( ..cmds ..)是back-tic cmd替换的现代版本。加入90年代并停止使用back-tics,除非您需要在真正的Bourne Shell /bin/sh下运行代码。

IHTH