2017-08-30 24 views
1

我想在Java运行时从linux启动一些jar。 从它的Linux的命令行会是这个样子:如何使用linux屏幕启动多个jar?

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

我该怎么办使用Java吗?

+1

你不能。不过你可以看看'screen'的命令行选项,来实现'^ AD'快捷键的功能... –

+0

你可以使用机器人api发送组合键。看看[这里](https://stackoverflow.com/questions/14595483/using-java-to-send-key-combinations)例如。 – ArcticLord

回答

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(); 
} 
+0

谢谢你!很有用。 –

相关问题