如何使用 linux 屏幕启动多个罐子?
How to start multiple jars using linux screens?
我想在 linux 中从 Java 运行时启动一些 jar。
从 Linux 的命令行看起来像这样:
> screen -S jar1
> java -jar Something1.jar
> Ctrl + AD
> screen -S jar2
...
我如何使用 Java 来做到这一点?
要使用自己的会话和命令启动屏幕,直接分离,您可以这样做:
screen -dmS jar1 bash -c "java -jar jar1.jar"
这是来自命令行,其中 screen
将分叉一个在后台执行的新进程,因此在 运行 以上内容之后您将返回到交互式 shell。但是在另一个程序中,您将使用 -D
而不是 -d
,例如对于 Java,您可能希望能够在您开始的过程中使用 waitFor()
。
来自 man screen
:
-d -m
Start screen in "detached" mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts.
-D -m
This also starts screen in "detached" mode, but doesn't fork a new process. The command exits if the session terminates.
带有 2 个虚拟 long-运行 命令的示例:
% 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();
}
我想在 linux 中从 Java 运行时启动一些 jar。 从 Linux 的命令行看起来像这样:
> screen -S jar1
> java -jar Something1.jar
> Ctrl + AD
> screen -S jar2
...
我如何使用 Java 来做到这一点?
要使用自己的会话和命令启动屏幕,直接分离,您可以这样做:
screen -dmS jar1 bash -c "java -jar jar1.jar"
这是来自命令行,其中 screen
将分叉一个在后台执行的新进程,因此在 运行 以上内容之后您将返回到交互式 shell。但是在另一个程序中,您将使用 -D
而不是 -d
,例如对于 Java,您可能希望能够在您开始的过程中使用 waitFor()
。
来自 man screen
:
-d -m
Start screen in "detached" mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts.
-D -m
This also starts screen in "detached" mode, but doesn't fork a new process. The command exits if the session terminates.
带有 2 个虚拟 long-运行 命令的示例:
% 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();
}