dstat 这行输出转到哪个 io 流

dstat 这行输出转到哪个 io 流

当我dstat从内核 2.6 CentOS 6 64 位运行时。我得到以下输出:

# sed -n '4p' <(dstat -dl --float --nocolor 1 1) | awk -F '|' '{print $1,$2}' | awk '{print $1,$2,$3}'
Module dstat_disk24old failed to load. (No suitable block devices found to monitor)
0 0.01 0

有趣的是这一行:

Module dstat_disk24old failed to load. (No suitable block devices found to monitor)

当我附加| grep -v failedor时2> /dev/null,它不会过滤掉这一行。当我追加时> a.txt,这一行也不会转到a.txt。所以我想知道这条线会流向哪个流,即使它打印在屏幕上?

答案1

它进入标准错误,默认为文件描述符 2。而 in 时cmd1 | cmd2,只有标准 out ofcmd1被重定向到标准 in of cmd2

按照惯例,所有错误和诊断消息都将转至标准错误。

您可以使用strace以下方式确认:

$ strace -e write dstat -dl --float --nocolor 1 1
write(2, "Module dstat_disk24old failed to"..., 83Module dstat_disk24old failed to load. (No suitable block devices found to monitor)) = 83
write(2, "\n", 1
)                       = 1
write(1, "\33[7l---load-avg---\n 1m   5m  15m"..., 34---load-avg---
 1m   5m  15m 
) = 34
write(1, "   0    0    0\n", 15   0    0    0
)        = 15
write(1, "   0    0    0\n", 15   0    0    0
)        = 15
+++ exited with 0 +++

如果您希望管道捕获标准错误输出,则必须将标准错误重定向到标准输出:

dstat -dl --float --nocolor 1 1 2>&1

答案2

>文件重定向器适用于标准输出。既然你还说 grep 看不到它,你是否认为它是标准错误?要确认并捕获它是否确实是 st​​derr,请尝试:

yourlongcommand 2> error.log

并检查 error.log。

相关内容