Bash

是否有工具可以根據請求將輸出動態重定向到新文件

  • May 4, 2016

我目前正在將監視工具的輸出重定向到文件,但是我想做的是根據我的請求(使用鍵綁定)將此輸出重定向到新文件,而不停止所述工具。

就像是

monitor_program | handle_stdout

Wherehandle_stdout允許我定義一個新文件,將日誌放在某個位置。

我知道我可以輕鬆編寫它,但我想知道是否有任何工具已經允許這樣做。

我會建議一個命名管道。

  1. 創建一個管道mkfifo p(如果不是 ‘p’,可以隨意呼叫它)
  2. 創建一個“閱讀器”腳本,從管道讀取並寫入任何你喜歡的地方
  3. 告訴監控程序將其日誌寫入命名管道

這是一個從命名管道“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 有可能在錯誤的時間(在寫入系統呼叫中)傳遞,從而導致一些數據失去。

引用自:https://unix.stackexchange.com/questions/281029