[注:这与如何从Java程序中启动完全独立的进程?有关,但不同]
我希望能够从“管理器”Java进程中生成外部进程(shell脚本),当JVM被终止时,该进程应该继续运行- 但是当我终止父Java程序时,子进程也会被终止(请注意,如果JVM自然退出,则行为不同)。 我拥有的最简单的测试程序是:
public class Runit {
public static void main(String args[]) throws IOException, InterruptedException {
Runtime.getRuntime().exec(args[0]);
// doesn't work this way either
// ProcessBuilder pb = new ProcessBuilder(args[0]);
// pb.start();
while (true) {
System.out.println("Kill me");
Thread.sleep(2000);
}
}
}
和外部脚本:
#!/bin/sh
while [ 1 ] ; do
ls
sleep 1
done
运行方式
java -classpath jar-with-dependencies.jar temp.exec.Runit runit.sh
如果管理器简单地退出(即在Java程序中取出“while”循环),则生成的进程将继续运行,但是当我按下Ctrl+c时,Java程序也会被杀死,这不是我想要的。
我在Ubuntu上使用OpenJDK 1.6。
编辑1:将exec更改为
Runtime.getRuntime().exec("/usr/bin/nohup " + args[0]);
并不起作用。
编辑2:根据如何在Java中优雅地处理SIGKILL信号中描述的添加一个关闭挂钩,不能阻止Ctrl+c被传播到子进程。
$(runit.sh)
可以帮忙? - Vladimir Chervanev