概述
你可以用一点C来做,只要你不担心一些条件,并明白它会有局限性。
prctl(PR_SET_PDEATHSIG, …)系统调用是linux内核的一部分,并且有一些规则 - 它不会生存fork(),它不会生存exec()到setuid / setgid二进制文件。
限制是:
这是一个简单的程序,如果你从子进程中启动其他东西,将杀死一些东西,除非你设置了一些限制。
它不会在可执行模型(例如32-> 64bit)之间工作,这是相对罕见的
它不能使用静态链接二进制文件(罕见)
考虑到这些限制,我们可以从一些将调用此系统调用的C创建一个小的预加载库。所以,例如:
#include
#include
#include
__attribute__((constructor))
static void on_load() {
prctl(PR_SET_PDEATHSIG, SIGTERM);
}
使用gcc -fPIC -shared -o term_death.so term_death.c编译
当您使用LD_PRELOAD环境变量以及此二进制文件的完整路径时,任何启动的程序将在其父进程被终止时发送SIGTERM。
这是来自C方面的设置 - 我们现在有一个帮助程序库,它将允许您要求的行为。
从java端开始工作。
我们需要将.so的完整路径注入到ProcessBuilder的LD_PRELOAD环境变量中,如下所示:
ProcessBuilder pb = new ProcessBuilder();
Map env = pb.environment();
env.put("LD_PRELOAD", "/home/me/development/experiments/term_death.so");
再次,您需要指定.so的路径,以便可以加载它。
当您pb.start()时,它将继承LD_PRELOAD环境变量。在加载可执行文件时,它会运行on_load代码(因为它被标记为构造函数)并且表示当父进程终止时进程将收到SIGTERM。
这有点难看,但应该解决这个问题。
最后
以上就是洁净羽毛为你收集整理的java子进程_Java:如何在子进程的全部内容,希望文章能够帮你解决java子进程_Java:如何在子进程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复