2017-08-10 89 views
1

我有一個java應用程序,我在linux系統上運行基於控制檯的程序,我正在閱讀那些程序的輸出,然後我的java應用程序將它發送到網頁。Java啓動獨立進程

但是,一旦我關閉了我的Java應用程序,所有的進程將會「卡住」,或者他們只是簡單地崩潰。所以每次我想對我的java應用程序進行一些更改時,我需要重新啓動它,我還必須關閉從我的應用程序運行的所有進程。我想在關閉我的應用程序時保存它們的PID,然後根據已保存的進程PID再次對這些進程執行控制(輸出流)。

有沒有辦法做到這一點?

我運行像這樣我的程序:

ProcessBuilder processBuilder = new ProcessBuilder(new String[] { "su", "- 
s", "/bin/sh", "myuser", "-c", "java -jar myjar.jar" });, 
Process p = processBuilder.start(); 

編輯:

我的問題是沒有找到進程PID我的問題是,我從我的Java應用程序lanched子過程我的Java應用程序後崩潰被關閉/終止,我需要他們繼續運行,即使我的應用程序正在重新啓動/停止。

+0

在unix.stackexchange,我發現這一點:https://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to -detached-process可以確認這解決了你的問題,然後我將這裏的問題作爲重複來解決嗎? – ControlAltDel

+0

不,這不解決我的問題,它的Java相關不終端相關。我需要在java中「分離」我的進程,而不是在終端。我需要以某種方式改變我從java應用程序啓動我的過程的方式。那就是我所要求的幫助。 – Welite

回答

2

您的問題是由於所謂的Unix作業控制。與許多shell一樣,/bin/sh攔截SIGHUP和SIGINT信號,並且在退出之前,它根據其配置和狀態(例如,停止的後臺進程接收到SIGCONT)向其子進程組發送信號, 。因此,當您的主要Java應用程序關閉時,應用程序分叉的/bin/sh外殼將終止,並且在退出之前,它會向其子進程發送一個SIGHUP信號,該子進程對應於命令java -jar myjar.jar

因此,您的問題的答案是:只使用huponexit/bin/sh shell選項來避免殺死子進程。如果有的話,它們將從控制終端分離,但它們不會被殺死。

所以,更換此java -jar myjar.jar通過shopt -u huponexit; java -jar myjar.jar

ProcessBuilder processBuilder = 
    new ProcessBuilder(new String[] { 
    "su", "-s", "/bin/sh", "myuser", "-c", 
    "shopt -u huponexit; java -jar myjar.jar" 
    }); 
Process p = processBuilder.start(); 
+1

謝謝!這正是我所需要的,現在我可以重新啓動我的應用程序,而無需關閉所有子進程,並讓它們繼續運行,然後再次啓動我的應用程序後再控制它們:) – Welite

1

我會在Linux中使用ps命令來獲取要控制的每個正在運行的進程的數量,當然,您可以像使用ProcessBuilder一樣執行它。我會然後管; 「|」 (Linux命令),輸出到您保存在Java項目某處的文件中。

Linux命令從Java程序看起來會很長

PS -A的線執行| grep「your_program_name」> /path/to/your/project/my_process_list_file.txt

其中>將執行的命令的輸出存儲到您的文件。

然後我會從這個文件中讀取並執行一些其他的Linux命令,以您希望的方式來控制該進程。

祝你好運,快樂的編碼我的朋友!

+1

感謝回答,但是這不完全是我的問題,我已經eddited我的帖子。請看看,謝謝:) – Welite

+0

啊,我明白了!我想我並沒有用我的答案完全觸及正確的基礎。無論如何,我希望你能從中受益。另外,這個問題其實幫我解決了一個問題,就是我自己的程序,我甚至都不知道我正在經歷,所以謝謝你的提問! –

1

嘗試這樣運行命令:

Runtime.getRuntime().exec("gedit"); 

它在一個單獨的進程中執行指定的字符串命令。

1

前段時間我找到一些有用的信息here。嘗試這個。

+0

只是想法 - 我沒有嘗試。在linux env中,你可以嘗試使用'nohup'命令。 – Nequeq