亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java ProcessBuilder:結果進程掛起

Java ProcessBuilder:結果進程掛起

鳳凰求蠱 2019-12-04 10:30:47
我一直在嘗試使用Java的ProcessBuilder在Linux中啟動應“長期”運行的應用程序。該程序的運行方式是啟動命令(在本例中,我正在啟動媒體播放應用程序),允許其運行并檢查以確保它沒有崩潰。例如,檢查PID是否仍處于活動狀態,然后重新啟動該進程(如果已終止)。我現在遇到的問題是PID在系統中仍然有效,但是應用程序的GUI掛起了。我嘗試將ProcessBuilder(cmd).start()移到一個單獨的線程中,但這似乎并沒有解決任何問題,正如我希望的那樣?;旧?,結果是,對于用戶來說,該程序似乎已經崩潰,但是殺死了驅動ProcessBuilder.start()的Java進程實際上使所創建的Process恢復其正常行為。這意味著Java應用程序中的某些內容正在干擾生成的Process,但是目前我還不知道是什么。(因此,為什么我嘗試將其分成另一個線程,似乎沒有解決任何問題)如果有人有任何意見/想法,請讓我知道,因為我一生無法思考如何解決此問題。編輯:我不關心從流程創建的I / O流,因此沒有采取任何措施來處理-這會導致流程本身掛起嗎?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

你想要的把戲?


不要從ProcessBuilder.start()啟動過程。不要試圖弄亂Java的流重定向/消耗(特別是如果您不提供任何有關的信息;)


使用ProcessBuilder.start()啟動一個小的shell腳本,吞噬所有輸入/輸出流。


像這樣:


#!/bin/bash


nohup $1 >/dev/null 2>error.log &

那就是:如果您不關心stdout,仍然想將stderr(對嗎?)記錄到文件中(請在error.log此處)。


如果您甚至不關心stderr,只需將其重定向到stdout即可:


#!/bin/bash


nohup $1 >/dev/null 2>1 &

然后,您從Java調用了這個小腳本,將要運行的進程的名稱作為參數提供給它。


如果在Linux上運行的同時將stdout和stderr都重定向到/ dev / null的進程仍然產生任何東西,則說明您的Linux安裝不合要求;)


換句話說:上面的Just Works?擺脫了有問題的“您需要按此順序使用流,并且按順序使用Java特定的廢話”。


查看完整回答
反對 回復 2019-12-04
?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

如果運行進程的線程不處理輸出,則該線程可能會阻塞。這可以通過產生一個讀取進程輸出的新線程來完成。


    final ProcessBuilder builder = new ProcessBuilder("script")

                    .redirectErrorStream(true)

                    .directory(workDirectory);


    final Process process = builder.start();

    final StringWriter writer = new StringWriter();


    new Thread(new Runnable() {

        public void run() {

            IOUtils.copy(process.getInputStream(), writer);

        }

    }).start();


    final int exitValue = process.waitFor();

    final String processOutput = writer.toString();


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 1574 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號