【问题标题】:How to run a proccess completely seperate in Java如何在 Java 中运行完全分离的进程
【发布时间】:2016-01-17 18:01:18
【问题描述】:

我有一个 Java 程序,它使用 ProcessBuilder 启动另一个进程,如下所示:

String commands[] = {"ruby", "/home/scripts/script.rb"};
ProcessBuilder builder = new ProcessBuilder(commands);
Map<String,String> map = builder.environment();
map.put("TYPE", "sometype");
try {
    builder.start();
} catch (IOException e) {
    e.printStackTrace();
}

在进程开始执行一段时间后(一个不应终止的小型 Rub​​y 脚本),Java 程序退出。

问题是,一旦 Java 程序执行完毕,所有子进程都将关闭,Ruby 脚本也是如此。

我发现了一些类似的问题,但答案总是,流程是独立的。但在我的情况下并非如此,如果 Java 程序退出,Ruby 代码将始终停止执行。

我在使用 Java 8u66 的 Debian Jessie 系统上尝试了 Java 代码

【问题讨论】:

  • 使用nohup启动进程。
  • @ElliottFrisch nohup 是不是类似于 screen? Ruby 执行完毕后 nohup 进程会终止吗?
  • 可能有一些特定于环境的设置。例如,如果我需要在windows中运行'cmd.exe',我需要提供:String commands[] = {"C:/Windows/System32/cmd.exe","/c","start","C:/users/amber/desktop/temp.bat"};这是temp.bat Set COUNTER=0 echo off :loop if %COUNTER%==3 set COUNTER=0 if %COUNTER%==2 set COUNTER=3 if %COUNTER%==1 set COUNTER=2 if %COUNTER%==0 set COUNTER=1 ping 127.0.0.1 -n 2 &gt; nul echo %COUNTER% goto loop
  • @Amber OP 指定 debian linux。 nohupPOSIX 标准命令,(在 shell 或子进程中)用于忽略 HUP(或 HangUp)信号。
  • @ElliottFrisch 好的,谢谢你解决了我的问题。你想把它写成答案让我接受吗?

标签: java processbuilder


【解决方案1】:

问题是,一旦 Java 程序执行完毕,所有子进程都将关闭,Ruby 脚本也是如此。

在 *nix 系统(POSIX 真的,包括 Debian Linux)上,当其父进程结束时,进程会被发送一个 HUP signalSIGHUPhangup)。您可以在启动子进程时使用nohup(1) 命令来忽略 child 进程中的hangup

或者,您可以可能使用 Ruby Signal Module 并使用 Signal.trap(HUP) 以其他方式处理它。

【讨论】:

    【解决方案2】:

    尝试使用Process.getOutputStream,等待进程输出,运行Ruby,如果时间太长,也可以在后台运行。

    【讨论】:

    • 我不想在退出 Java 之前等待 Ruby 脚本完成执行。如何从 Java 在后台启动进程?
    • 您可以在命令数组中添加 nohup 或 & 以在 java 的后台执行进程。 ProcessBuilder builder = new ProcessBuilder("nohup ruby​​ /home/scripts/script.rb &");
    猜你喜欢
    • 2012-04-18
    • 2021-02-26
    • 2018-08-13
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2019-12-25
    相关资源
    最近更新 更多