2017-08-30 45 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

謝謝你!很有用。 –

相關問題