2014-02-21 43 views
1

我有一個Java程序,我在Mac OS X上使用Bash腳本運行。我有兩個文件 - 一個FIFO,允許我將命令輸入到程序中,以及一個輸出日誌文件。Bash輸入和輸出重定向

的bash腳本包含以下代碼:

#!/bin/bash 
java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 & 
echo $! >| ./run/server.pid 

老實說,我不記得爲什麼我在第三行中使用>|(我只知道,它的工作原理)。在java行中,第一個<將fifo文件重定向到標準輸入。 >>應該將標準輸出重定向到文件,並且2>&1也應該重定向標準錯誤。然後它在後臺運行。

問題是沒有任何東西寫入server.log文件。讀取命令fifo文件,但日誌不寫入。該程序是寫入標準輸出(如果我自己運行它可以正常工作)。

我也試過scriptthis question建議,但它沒有工作,要麼:

script -q /dev/null java -Xmx4G -Xms4G -jar current.jar --nogui <./run/command-fifo >>./run/server.log 2>&1 & 

任何人有想法,讓這個寫日誌正常嗎?

FOLLOWUP:我應該多解釋一下這個軟件的工作原理是否適合這個解釋。有三個部分,在這裏工作:

  1. launchd使用在系統啓動時啓動該程序的plist中通過調用啓動程序腳本
  2. 啓動器腳本處理中止信號並等待Java進程
  3. 的PID
  4. 啓動腳本,由啓動腳本調用,即啓動程序並保存其PID

上面給出的腳本是啓動腳本。這將啓動java進程,將其pid回顯到一個文件,然後返回。啓動腳本(這裏沒有給出)然後等待pid在終止之前退出。如果它終止,launchd會自動重新啓動啓動腳本。

Launchd具有可以爲其啓動的文件設置標準輸出路徑的功能。實質上,它將啓動腳本的stdout重定向到給定的文件。

我做到了,你看,它的工作原理。通過將開始腳本行更改爲以下內容:

java -jar file.jar <>./run/command-fifo & 

它允許通過啓動並寫入文件來捕獲標準輸出。這有點不同,但它確實有效。這很奇怪,因爲啓動腳本在技術上沒有任何可輸出的內容,因爲java進程在後臺,但是它起作用,它實際上是以某種方式工作的。當然,我更願意明確地將文件的標準輸出重定向到一個文件中(在其他腳本中可能存在多於一個的情況,並且我需要將它們分開)。我仍然會試驗並嘗試尋找解決方案。

+1

我不是java專家,但我敢打賭,你的Java程序只是緩衝輸出(可能會寫輸出大小達到8K或64K字節)。同時,'> |'重定向操作符的意思是「寫入文件,即使它存在*和*我也已經完成了'set -o noclobber',這樣您通常會拒絕重定向並顯示文件存在的錯誤」 。更令人印象深刻的是,管道意味着:「我真的是這個意思!」 – torek

回答

1

我認爲@torek關於緩衝的評論可能是對的。你可以強迫你java過程中使用的stdbuf utility到行緩衝器輸出:

#!/bin/bash 
stdbuf -oL java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 & 
echo $! >| ./run/server.pid 

關於>|操作,@torek也是正確的。 Here is the bash manual entry

+0

謝謝。不幸的是'stdbuf'(和'unbuffer'看起來很相似)沒有安裝在Mac OS X上,並且沒有正式提供。我正在尋找安裝它們的方法,但這可能是不可能的。我確實嘗試了'腳本-q/dev/null java -Xmx4G -Xms4G -jar current.jar --nogui <./ run/command-fifo >> ./ run/server.log 2>&1&'但是沒有'不管工作。 –

+0

@JustinMrkva - 對不起,我不確定這裏發生了什麼。我可以讓'script -q'在這個例子中工作:'for((i = 0 ;; i ++));做echo $ i;睡眠0.001;完成| grep。 >> server.log' - 在這裏'grep'緩存它的重定向到文件 - 你可以通過'tail -f'文件來看到這個。但如果你這樣做(for((i = 0 ;; i ++));做echo $ i;睡眠0.001;完成|腳本-q/dev/null grep。 >> server.log'然後你看到文件不斷更新。 –

+0

見上面的後續。我讓它以另一種方式工作。我認爲Java程序本身可能與怪異的行爲有關,但我不知道。我運行了你的腳本,而且我看到的結果與你的結果一致。 –