当我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 failed
or时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 看不到它,你是否认为它是标准错误?要确认并捕获它是否确实是 stderr,请尝试:
yourlongcommand 2> error.log
并检查 error.log。