我有一個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文件,但日誌不寫入。該程序是寫入標準輸出(如果我自己運行它可以正常工作)。
我也試過script
在this question建議,但它沒有工作,要麼:
script -q /dev/null java -Xmx4G -Xms4G -jar current.jar --nogui <./run/command-fifo >>./run/server.log 2>&1 &
任何人有想法,讓這個寫日誌正常嗎?
FOLLOWUP:我應該多解釋一下這個軟件的工作原理是否適合這個解釋。有三個部分,在這裏工作:
- 是
launchd
使用在系統啓動時啓動該程序的plist中通過調用啓動程序腳本 - 啓動器腳本處理中止信號並等待Java進程 的PID
- 啓動腳本,由啓動腳本調用,即啓動程序並保存其PID
上面給出的腳本是啓動腳本。這將啓動java進程,將其pid回顯到一個文件,然後返回。啓動腳本(這裏沒有給出)然後等待pid在終止之前退出。如果它終止,launchd會自動重新啓動啓動腳本。
Launchd具有可以爲其啓動的文件設置標準輸出路徑的功能。實質上,它將啓動腳本的stdout重定向到給定的文件。
我做到了,你看,它的工作原理。通過將開始腳本行更改爲以下內容:
java -jar file.jar <>./run/command-fifo &
它允許通過啓動並寫入文件來捕獲標準輸出。這有點不同,但它確實有效。這很奇怪,因爲啓動腳本在技術上沒有任何可輸出的內容,因爲java進程在後臺,但是它起作用,它實際上是以某種方式工作的。當然,我更願意明確地將文件的標準輸出重定向到一個文件中(在其他腳本中可能存在多於一個的情況,並且我需要將它們分開)。我仍然會試驗並嘗試尋找解決方案。
我不是java專家,但我敢打賭,你的Java程序只是緩衝輸出(可能會寫輸出大小達到8K或64K字節)。同時,'> |'重定向操作符的意思是「寫入文件,即使它存在*和*我也已經完成了'set -o noclobber',這樣您通常會拒絕重定向並顯示文件存在的錯誤」 。更令人印象深刻的是,管道意味着:「我真的是這個意思!」 – torek