Java启动独立进程

时间:2017-08-10 15:53:55

标签: java process parent-child

我有一个java应用程序,我在linux系统上运行基于控制台的程序,我正在读取这些程序的输出,然后我的java应用程序将它发送到网页。

但是一旦我关闭了我的Java应用程序,所有进程都会被卡住"或者他们只是简单地崩溃因此,每次我想对我的Java应用程序进行一些更改,我需要重新启动它,我还必须关闭从我的应用程序运行的所有进程。我想在关闭我的应用程序时保存它们的PID,然后根据保存的进程PID再次对这些进程进行控制(输出流)。

有什么办法吗?

我正在运行这样的程序:

ProcessBuilder processBuilder = new ProcessBuilder(new String[] { "su", "-
s", "/bin/sh", "myuser", "-c", "java -jar myjar.jar" });,
Process p = processBuilder.start();

编辑:

我的问题是没有找到进程PID我的问题是我的java应用程序挂起的子进程在我的java应用程序关闭/终止后崩溃,我需要它们继续运行,即使我的应用程序正在重新启动/停止。

4 个答案:

答案 0 :(得分:2)

您的问题是由于所谓的 Unix作业控制

与许多shell一样,/bin/sh拦截SIGHUP和SIGINT信号,在退出之前,它会向其某些子进程组发送信号,具体取决于其配置和状态(例如,已停止的后台进程接收)一个SIGCONT)。

因此,当您的主Java应用程序关闭时,您的应用程序分叉的/bin/sh shell将被终止,并且在退出之前,它会向其对应于命令java -jar myjar.jar的子进程发送一个SIGHUP信号

所以,你的问题的答案是:只需使用huponexit / bin / sh shell选项来避免杀死子进程。如果有的话,它们将与控制终端分离,但它们不会被杀死。

因此,请将此java -jar myjar.jar替换为shopt -u huponexit; java -jar myjar.jar

ProcessBuilder processBuilder =
  new ProcessBuilder(new String[] {
    "su", "-s", "/bin/sh", "myuser", "-c",
    "shopt -u huponexit; java -jar myjar.jar"
  });
Process p = processBuilder.start();

答案 1 :(得分:1)

我会在Linux中使用ps命令来获取你想要控制的每个进程的运行数,当然你可以像上面的ProcessBuilder一样执行它。然后我会管道; " |" (Linux Command),将输出保存到Java项目中的某个地方。

从Java程序执行的Linux命令看起来很像

ps -A | grep" your_program_name" > /path/to/your/project/my_process_list_file.txt

>将执行的命令输出存储到您的文件中。

然后我会从这个文件中读取并执行一些其他Linux命令,以您想要的任何方式控制该过程。

祝你好运,并且很高兴为我的朋友编码!

答案 2 :(得分:1)

尝试像这样运行命令:

Runtime.getRuntime().exec("gedit");

它在一个单独的进程中执行指定的字符串命令。

答案 3 :(得分:1)

前段时间我发现了一些有用的信息here。试试这个。

相关问题