是否有工具可以根据请求将输出动态重定向到新文件

Tre*_*iño 8 bash pipe io-redirection stdout

我目前正在将监控工具的输出重定向到一个文件,但是我想做的是根据我的请求将此输出重定向到一个新文件(使用键绑定),而不停止上述工具。

就像是

monitor_program | handle_stdout
Run Code Online (Sandbox Code Playgroud)

Wherehandle_stdout允许我定义一个新文件在某个点放置日志的位置。

我知道我可以轻松编写它,但我想知道是否有任何工具已经允许这样做。

Jef*_*ler 9

我会建议一个命名管道。

  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
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在读取器脚本中捕获一个信号(例如 USR1)作为切换日志的信号。 (2认同)

Sté*_*las 7

建立在你的 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)
Run Code Online (Sandbox Code Playgroud)

这假设cat不是您的 shell 中的内置函数(因此它确实会被您按 中断Ctrl+\)。

请注意,与您的方法一样,有可能在错误的时间(在写入系统调用中)传递 SIGQUIT,从而导致某些数据丢失。