如何使用Linux屏幕启动多个罐子?

时间:2017-08-30 07:55:51

标签: java linux gnu-screen

我想从Java运行时启动Linux中的一些jar。 从Linux的命令行看起来像这样:

> screen -S jar1
> java -jar Something1.jar
> Ctrl + AD
> screen -S jar2
...

我如何使用Java做到这一点?

1 个答案:

答案 0 :(得分:0)

使用自己的会话启动屏幕&命令,直接分离,你可以这样做:

screen -dmS jar1 bash -c "java -jar jar1.jar"

来自命令行,screen将分叉在后台执行的新进程,因此在运行上述内容后,您将回到交互式shell中。但是从另一个程序中,您可以使用-D而不是-d,例如使用Java,您可能希望能够waitFor()启动您的流程。
来自man screen

  

-d -m开始屏幕"分离"模式。这会创建一个新会话但​​不会附加到该会话。这对系统启动脚本很有用       -D -m这也会启动"分离"模式,但不分叉新进程。如果会话终止,该命令将退出。

2个虚拟长时间运行命令的示例:

% screen -dmS app-top top

% screen -dmS app-foo bash -c "while sleep 1; do date; done"

% screen -ls
There are screens on:
        25377.app-foo   (08/30/2017 09:26:24 AM)        (Detached)
        24977.app-top   (08/30/2017 09:23:41 AM)        (Detached)

流程树:

SCREEN -dmS app-foo bash -c while sleep 1; do date; done
 \_ bash -c while sleep 1; do date; done
    \_ sleep 1
SCREEN -dmS app-top top
 \_ top

所以从Java开始,就像这样:

private Process runInScreen(String sessionName, String command) throws IOException {
    return new ProcessBuilder("screen", "-DmS", sessionName, "bash", "-c", command).inheritIO().start();
}