2012-07-25 110 views
5

我必須做出一個Java程序,當用戶輸入0它應該退出。在java代碼中編寫沒有問題。後臺進程聽標準輸入

int cmd = read(); 
System.out.println("got command : " + cmd); 
if (cmd == 48) { // ASCII code for 0 
System.exit(0); 

我想在Linux中使用啓動停止腳本運行此過程。我也能做到這一點使用&nohup

case "$1" in  
    'start') 
    if [ -f myfifo ]; then 
     rm myfifo 
    fi 
    mkfifo myfifo 
    cat > myfifo & 
    echo $! > myfifo-cat-pid 
    java -jar myjar.jar >/dev/null 2>&1 0<myfifo & 
    echo "Started process: "$! 
    ;; 

    'stop') 
    echo 0 > myfifo 
    echo "Stopped process: " 
    rm myfifo 
    ;; 
esac 

我的問題是,當我運行這個過程中它讀取輸入-1。當我想從stdinput中讀取somthing時,明確地回顯它,即停止被調用。簡單地說,我需要一個程序來明確地由shell腳本關閉。我努力了。幫我。

編輯:

我只想當用戶按q或任何這樣的事件和不想要的代碼無限循環關閉程序。如果可能的話,聽其他事件的任何其他方法也將有所幫助。我的代碼不應該爲事件進行輪詢。我已經嘗試了Jnotify,它在該目錄中創建或刪除文件時觀看目錄並引發事件。但是運氣不好,他們不支持SunOS。 :(

+0

你是如何讀取數值的? – poussma 2012-07-25 06:16:16

+0

using System.in.read();我也嘗試過使用BufferReader – 2012-07-25 06:20:18

+0

嗡嗡聲...你確定myfifo存在幷包含任何東西嗎? System.in.read()意味着可以正常工作......「mkfifo」是什麼? – poussma 2012-07-25 07:08:49

回答

0

如果你在你的shell腳本的頂部使用set -m(從而使強行作業控制),你應該會看到一個一致的行爲。

1

既然你已經在管道還沒有數據,read()看到流的結束,因爲這一點,返回-1。從流中讀取,以確保在它裏面的信息之前調用available()

3

嗯,其實fifo文件似乎沒有做出你想象

read()命令不阻塞管道,您應該循環,直到你得到的數據:。

try { 
     bis = new BufferedInputStream(System.in); 
     while (true) { 
      byte[] buffer = new byte[4096]; 
      if (bis.available() > 0) { 
       bis.read(buffer, 0, bis.available()); 
       // do some clever thing 
      } else { 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } catch (IOException e) { 
     // it failed... 
    } 

這會嘗試讀取,如果沒有任何內容,則會等待50毫秒。

M.

+0

我忘了提及我也使用while循環完成了這一操作,但是它會持續從標準輸入讀取,我不希望因爲它的無限循環直到用戶發送正確的命令。 :( – 2012-07-25 07:45:48

+0

你需要什麼?在你的程序中做些什麼,同時聽stdin?當用戶按下「q」時,它會停止你的程序? – poussma 2012-07-25 07:48:38

+0

是的,這是我需要的,但程序應該在後臺運行 – 2012-07-25 07:51:10

0

當您在一個腳本命令的標準輸入被隱式地從/dev/null重定向背景的命令。

# test by executing a script with ... 
- cat > myfifo & lsof -p $! 
+ cat 0<&0 > myfifo & lsof -p $! 
相關問題