好的,我道歉。通过终止并启动它来玩弄该进程,看起来我没有正确结束脚本。
我有一个csh
我运行该脚本来在 AIX 系统上启动 java 应用程序。
我通常做什么:
在 typescript /终端中运行
startApp.csh >> ../log/app.log &
但是我遇到了一个问题,其中 startApp.csh
java应用程序启动后不会停止。它在后台显示如下:
/bin/csh startApp.csh
沿着java进程$JRE_HOME/bin/java -XMS16M -Xmx512M \-Set \-all \-necessary \-environments $argv[*]
。他们现在都相互依赖才能继续奔跑。如果我杀了/bin/csh startApp.csh
java应用程序不会因我的端口调用而停止,除非我执行 kill -9
startApp.csh
#!/bin/csh
setenv JAR_HOME /to/directory/
setenv JAVA_HOME /to/directory/
setenv JRE_HOME /to/directory/
set CLASSPATH="${CLASSPATH}:$to/path"
$JRE_HOME/bin/java -XMS16M -Xmx512M \-Set \-all \-necessary \-environments $argv[*]
我不知道如何在 java 应用程序运行时告诉我的脚本结束。我怎样才能实现这一目标?
<小时/>更新:
这是我迄今为止尝试过的让 java 子进程自行运行并让父 shell 脚本终止的方法。
在 typescript /终端中运行
startApp.csh >> ../log/app.log
#!/bin/csh
setenv JAR_HOME /to/directory/
setenv JAVA_HOME /to/directory/
setenv JRE_HOME /to/directory/
set CLASSPATH="${CLASSPATH}:$to/path"
nohup $JRE_HOME/bin/java ... $argv[*] &
nohup command &
将忽略父进程已结束的事实,并将带我返回 typescript /终端以进行下一个输入。
我只是不太清楚该进程作为 PPID 为 1 的子进程运行是否重要。
最佳答案
简单,使用exec
:
#!/bin/csh
setenv JAR_HOME /to/directory/
setenv JAVA_HOME /to/directory/
setenv JRE_HOME /to/directory/
set CLASSPATH="${CLASSPATH}:$to/path"
exec $JRE_HOME/bin/java -XMS16M -Xmx512M \-Set \-all \-necessary \-environments $argv[*]
如果没有 exec
,csh 会假定它需要作为进程保留下来,并等待 java 进程结束,然后执行 csh 脚本中的下一行。在您的情况下,没有下一行,因此结束。
使用exec
,csh 进程被“替换”为具有相同进程 ID 的 Java 进程。
关于java - 如何在调用继续进程时结束 C Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52043941/