我目前正試圖讓腳本將其他已啓動命令的輸出正確寫入日誌文件。該腳本會使用echo將它自己的消息寫入日誌文件,並且有一種方法可以將流水線從其他程序中抽取出來。當寫單行時是回聲原子
主要的問題是,產生輸出的程序是在後臺啓動的,所以執行讀操作的函數可能會一致地寫入日誌文件。這可能是一個問題嗎?回聲總是隻寫一行,所以不應該很難確保原子性。然而,我看了谷歌,我發現沒有辦法確保它實際上是原子。
這是當前腳本:
LOG_FILE=/path/to/logfile
write_log() {
echo "$(date +%Y%m%d%H%M%S);$1" >> ${LOG_FILE}
}
write_output() {
while read data; do
write_log "Message from SUB process: [ $data ]"
done
}
write_log "Script started"
# do some stuff
call_complicated_program 2>&1 | write_output &
SUB_PID=$!
#do some more stuff
write_log "Script exiting"
wait $SUB_PID
正如你所看到的,該腳本可以寫上都它自己以及因爲重定向輸出。這可能會導致文件havok?
我不認爲bash是這份工作的正確工具。我會推薦一些更強大的功能(perl,python,ruby ..) – Daenyth 2012-03-29 14:28:26
順便說一下,如果你有很多數據進入這個日誌,那麼你可能會發現持續打開和關閉日誌文件是一個壞主意。你可以使用'exec 3 >> $ {LOG_FILE}'永久地打開一個文件,然後隨時用'echo whatever>&3'來寫入它。您可以使用'exec 3>& - '關閉文件,但腳本退出時會發生這種情況。唯一的問題是您必須爲每個打開的文件手動選擇一個數字,並且已經採用了0,1和2。 – ams 2012-03-29 14:44:38