【发布时间】:2014-09-20 16:03:04
【问题描述】:
[注意。这与How do I launch a completely independent process from a Java program?有关但不同]
我希望能够从“管理器”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。
Edit1:将执行更改为
Runtime.getRuntime().exec("/usr/bin/nohup " + args[0]);
没用。
Edit2:如How to gracefully handle the SIGKILL signal in Java 中所述添加关闭挂钩不会阻止 Ctrl+c 被传播到子级。
【问题讨论】:
-
这是在哪个操作系统中? Unix/Linux?
-
见*.com/questions/2541597/…。这似乎没有灵丹妙药。
-
可能是
$(runit.sh)可以帮忙吗?
标签: java