当我杀死主管时,如何确保主管作业的子进程终止

当我杀死主管时,如何确保主管作业的子进程终止

我的应用程序是一个 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替换bashjava

[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 ...

相关内容