我在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.sh
与exit 1
一起返回时,确保流程被终止的正确方法是什么?
答案 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