我的应用程序是一个 jar 文件,需要一些环境变量。我将所有环境变量都放在一个文件中,如下所示:
export VAR=value
export VAR2=value2
#....etc
我的主管配置文件如下所示:
[program:programname]
command=bash -c "source /path/to/env/file && java -jar /path/to/jar.jar"
ps -ef | grep programname
在两个单独的行上显示两个进程:一个是bash -c "source blah && java blah"
,另一个只是java blah
。
现在,问题是:无论我这样做supervisorctl stop programname
还是service supervisor stop
甚至kill -9 whatever the supervisor pid is
,第一个进程都会死掉,但常规的java进程会留下来并成为孤儿,父进程pid现在为1。如何在不手动杀死jar的情况下让jar死掉?
答案1
使用exec
替换bash
为java
:
[program:programname]
command=bash -c "source /path/to/env/file && exec java -jar /path/to/jar.jar"
在这种情况下,您将只有一个进程需要终止。
答案2
将命令改为 shell 脚本,将其自身替换为 java?
#!/bin/bash
source /i/pity/da/env/foo
exec java ...