Bash
從連續執行的程序中限制標準輸出
我沒有太多運氣找到我的問題的答案,但也許我沒有正確地要求它。
我有一個啟動過程如下:
nohup ping 127.0.0.1 > log.txt >2>&1 &
非常簡單的命令,將所有標準輸出發送到 log.txt。唯一的問題是我正在執行的命令每隔 n 秒發送一次數據到 log.txt。我只想在我的 log.txt 文件中輸出一行,而不是附加它並冒著填滿驅動器的風險。
有沒有辦法只輸出一行到 log.txt 不斷被覆蓋?
這是一個快速而骯髒的解決方案,只在日誌文件中保留最後一行輸出:
ping localhost | while IFS= read -r line; do printf '%s\n' "$line" > log.txt; done
請注意,您現在在嘗試訪問文件進行讀取時可能會遇到各種競爭條件。從相互訪問中“鎖定”文件可能會有所幫助。有關在 stackoverflow 上鎖定此問題的更多資訊可能是一個好的開始:如何從多個腳本同步(鎖定/解鎖)對 bash 中文件的訪問?
試試這個腳本,它對我有用:
% nohup ping 127.0.0.1 > log.txt >&1&
通過鍵入以下內容檢查程序是否正在執行:
% ps ax | grep ping
如果程序正在執行:
% tail -f log.txt
如果它繼續 ping,則您的腳本工作正常。