【问题标题】:Java launch independent processJava启动独立进程
【发布时间】:2017-08-10 15:53:54
【问题描述】:

我有一个 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 应用程序关闭/终止后崩溃,我需要它们继续运行,即使我的应用程序正在重新启动/停止。

【问题讨论】:

  • 在 unix.stackexchange 上,我发现了这个:unix.stackexchange.com/questions/31824/… 你能确认这解决了你的问题,然后我会在这里关闭你的问题吗?
  • 不,这并不能解决我的问题,它与 java 相关,与终端无关。我需要在java而不是终端中“分离”我的进程。我需要以某种方式改变从 java 应用程序启动进程的方式。这就是我寻求帮助的原因。

标签: java process parent-child


【解决方案1】:

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

像许多 shell 一样,/bin/sh 拦截 SIGHUP 和 SIGINT 信号,并在退出之前,根据其配置和状态(例如,停止的后台进程收到 SIGCONT )。

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

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

所以,用shopt -u huponexit; java -jar myjar.jar 替换这个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();

【讨论】:

  • 谢谢!这正是我所需要的,现在我可以重新启动我的应用程序而无需关闭所有子进程并保持它们运行,然后在我再次启动我的应用程序后控制它们:)
【解决方案2】:

尝试像这样运行你的命令:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 只是想法 - 我没有尝试过。在 linux 环境中你可以尝试使用 'nohup' 命令。
    【解决方案4】:

    我会在 Linux 中使用 ps 命令来获取您想要控制的每个正在运行的进程的数量,当然您可以像上面使用 ProcessBuilder 一样执行它。然后我会管; “|” (Linux 命令),输出到您保存在 Java 项目中某处的文件中。

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

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

    > 在哪里存储执行到文件的命令的输出。

    然后,我将从该文件中读取并执行一些其他 Linux 命令,以按照您希望的方式控制该进程。

    祝你好运,祝我的朋友编码愉快!

    【讨论】:

    • 感谢您的回答,但这不完全是我的问题,我已经编辑了我的帖子。请看一下,谢谢:)
    • 啊,我明白了!我想我的答案并没有准确地触及正确的基础。尽管如此,我希望你能从中得到一些好处。另外,这个问题实际上帮我解决了一个问题是我自己的程序,我什至不知道我正在经历,所以谢谢你的提问!
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 2018-05-12
    • 1970-01-01
    • 2014-07-15
    • 2015-02-21
    • 2012-07-20
    • 2021-06-27
    • 2012-11-15
    相关资源
    最近更新 更多