我想在Java运行时从linux启动一些jar。 从它的Linux的命令行会是这个样子:如何使用linux屏幕启动多个jar?
> screen -S jar1
> java -jar Something1.jar
> Ctrl + AD
> screen -S jar2
...
我该怎么办使用Java吗?
我想在Java运行时从linux启动一些jar。 从它的Linux的命令行会是这个样子:如何使用linux屏幕启动多个jar?
> 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
开始屏幕。这会创建一个新的会话,但不附加到它。这对系统启动脚本很有用。
-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();
}
谢谢你!很有用。 –
你不能。不过你可以看看'screen'的命令行选项,来实现'^ AD'快捷键的功能... –
你可以使用机器人api发送组合键。看看[这里](https://stackoverflow.com/questions/14595483/using-java-to-send-key-combinations)例如。 – ArcticLord