Bash
是否有工具可以根據請求將輸出動態重定向到新文件
我目前正在將監視工具的輸出重定向到文件,但是我想做的是根據我的請求(使用鍵綁定)將此輸出重定向到新文件,而不停止所述工具。
就像是
monitor_program | handle_stdout
Where
handle_stdout
允許我定義一個新文件,將日誌放在某個位置。我知道我可以輕鬆編寫它,但我想知道是否有任何工具已經允許這樣做。
我會建議一個命名管道。
- 創建一個管道
mkfifo p
(如果不是 ‘p’,可以隨意呼叫它)- 創建一個“閱讀器”腳本,從管道讀取並寫入任何你喜歡的地方
- 告訴監控程序將其日誌寫入命名管道
這是一個從命名管道“p”讀取數據並將數據寫入索引“mylog”文件的範例閱讀器腳本:
#!/bin/sh INDEX=0 switchlog() { read INDEX < newindex echo now writing to "mylog.$INDEX" } trap switchlog USR1 while : do cat p >> mylog."$INDEX" done
建立在您的 SIGINT 想法的基礎上,在這裡使用 SIGQUIT (
Ctrl+\
) 您仍然可以使用它Ctrl+C
來停止整個事情:(trap '' QUIT; monitor_command) | ( trap : QUIT ulimit -c 0 # prevent core dump so SIGQUIT behaves like SIGINT # for cat n=0; while n=$((n+1)); file=output.$n.log; do printf 'Outputting to "%s"\n' "$file" cat > "$file" done)
假設
cat
它不是你的 shell 中的內置函式(所以它會被你按 打斷Ctrl+\
)。請注意,就像在您的方法中一樣,SIGQUIT 有可能在錯誤的時間(在寫入系統呼叫中)傳遞,從而導致一些數據失去。