我想在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