我想从Java运行时启动Linux中的一些jar。 从Linux的命令行看起来像这样:
> screen -S jar1
> java -jar Something1.jar
> Ctrl + AD
> screen -S jar2
...
我如何使用Java做到这一点?
答案 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();
}