我启动一个 bash 脚本(以 glassfish 用户身份从 java 同步启动),该脚本触发另一个 bash 脚本:
从 Java 执行的脚本 1:
#!/bin/bash
#Start script2 as myUser on myUser desktop
echo myPassword | su -c "export DISPLAY=:0.0;xhost +localhost;script2.sh;" myUser &
echo "After subscript"
#---------------
#... other tasks
#---------------
echo "Before exit"
exit 0
从脚本 1 执行脚本 2
#!/bin/bash
# Start java app with date added by awk at the beginning of every line
java -cp .:./lib/* com.mypackage.MyClass 2>&1 | awk '{print strftime("%D %T",systime())" "$0 }' >> logFile.log &
# Start java app without date added by awk on logs
#java -cp .:./lib/* com.mypackage.MyClass 2>&1 >> logFile.log &
我的问题是脚本 1 永远不会退出,除非我杀死脚本 2 中启动的 java 进程。这个问题才不是如果我删除脚本 2 中的 awk 部分(如果我使用带注释的 java 命令行),则会发生这种情况。
我正在运行: - GNU bash,版本 4.2.53(1)-release (x86_64-redhat-linux-gnu) 在 Centos 6.4 - java 1.6.45 X86_64 和 Glassfish 3.1.2.2
答案1
最后我找到了解决方案。
据我所知,这是在我的脚本 2 中将两个进程放入后台的方法。看起来&仅适用于awk(这可以解释为什么它在没有 awk 部分的情况下也能工作)。
使用大括号,我可以将两个部分(java 和 awk)放在后台:
从脚本 1 执行脚本 2:
#!/bin/bash
# Start java app with date added by awk at the beginning of every line
{ java -cp .:./lib/* com.mypackage.MyClass 2>&1 | awk '{print strftime("%D %T",systime())" "$0 }'; } &>> logFile.log &
感谢大家!