我正在使用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
我已经使用已知有效和失败的命令验证2
了stderr
和)1
stdout
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。