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