stdout、stderr,还有其他什么?(解析 slapadd 输出时会发疯)

stdout、stderr,还有其他什么?(解析 slapadd 输出时会发疯)

我正在使用slapadd来恢复备份。该备份包含 45k 个条目,需要一段时间才能恢复,所以我需要从 获得一些进度更新slapadd。幸运的是,我有一个-v开关,它提供类似于此的输出:

添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d53)
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d54)
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d55)
.####### 44.22% 预计到达时间 05m05s 已用时间 04m spd 29.2 k/s
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d56)
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d57)
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d58)
添加: ”[电子邮件保护],ou=People,dc=example,dc=org"(00003d59)

每添加 N 个条目,slapadd都会写入一个进度更新输出行(.######## 44.22% eta 05m05s elapsed ...),我想保留该行,并为每个创建的条目写入一个输出行,我想隐藏该行,因为它会暴露人们的电子邮件地址,但仍然想计算它们以知道导入了多少用户

我考虑隐藏电子邮件并显示进度更新的方式是这样的:

$ slapadd -v ... 2>&1 | tee log.txt | grep '########'
# => would give me real-time progress update
$ grep "added" log.txt | wc -l
# => once backup has been restored I would know how many users were added

我尝试了上述的不同变化,但无论我尝试什么,我都无法 grep 进度更新输出行。

我追踪slapadd如下:

sudo strace slapadd -v ...

以下是我得到的结果:

write(2, "added: \"[email protected]"..., 78added: "[email protected],ou=People,dc=example,dc=org" (00000009)
) = 78
gettimeofday({1322645227, 253338}, NULL) = 0
_########    44.22% eta 05m05s elapsed      04m spd  29.2 k/s    ) = 80
write(2, "\n", 1
)      

如您所见,百分比线不会发送到 或stdout(仅供参考,stderr我已经使用已知有效和失败的命令验证2stderr和)1stdout

Q1:进度更新输出行去哪里了?
Q2:如何在将 stderr 发送到文件时对其进行 grep?

附加信息:我正在Openldap 2.4.21运行ubuntu server 10.04

第一次更新:可能相关的信息

http://www.openldap.org/lists/openldap-bugs/200903/msg00235.html

(“仪表”是我在“进度更新输出线”上面所说的)

> No, the code only enables the meter if stdout (was: stderr) is a tty, so
> redirecting it anywhere disables it.  The meter was enabled both by
> "slapadd -l file" and "slapadd<  file", but "cat file | slapadd" did
> disable it.  IMHO not exactly an obvious way..

但我的问题仍然存在,因为我不知道如何处理这些额外的信息。

答案1

您被 的一个奇怪行为所困扰slapadd。开发人员的邮件列表中对此进行了讨论。最重要的是,在重定向 stderr 时,进度表似乎被禁用或者仅当 STDIN 为 tty 时才启用(我无法根据几次谷歌搜索得出明确的结论 - 似乎您需要深入研究代码!)。

除此之外,您的思路正确。对于问题 2,我不太确定您的问题,但要将 STDERR 重定向到文件,只需执行slapadd -v ... 2>YOURFILE。这样您仍然可以在 STDOUT (1) 上执行 grep。

相关内容