Tre*_*iño 8 bash pipe io-redirection stdout
我目前正在将监控工具的输出重定向到一个文件,但是我想做的是根据我的请求将此输出重定向到一个新文件(使用键绑定),而不停止上述工具。
就像是
monitor_program | handle_stdout
Run Code Online (Sandbox Code Playgroud)
Wherehandle_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
Run Code Online (Sandbox Code Playgroud)
建立在你的 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,从而导致某些数据丢失。