Ubuntu

標準輸出,標準錯誤,還有什麼?(瘋狂解析 slapadd 輸出)

  • November 30, 2011

我正在使用slapadd恢復備份。該備份包含 45k 個條目,需要一段時間才能恢復,因此我需要從slapadd. 幸運的是,有一個-v開關可以提供與此類似的輸出:

添加:“mail=1@test.org,ou=People,dc=example,dc=org”(00003d53)
添加:“mail=2@test.org,ou=People,dc=example,dc=org”(00003d54)
添加:“mail=3@test.org,ou=People,dc=example,dc=org”(00003d55)
.######## 44.22% eta 05m05s 經過 04m spd 29.2 k/s
添加:“mail=4@test.org,ou=People,dc=example,dc=org”(00003d56)
添加:“mail=5@test.org,ou=People,dc=example,dc=org”(00003d57)
添加:“mail=6@test.org,ou=People,dc=example,dc=org”(00003d58)
添加:“mail=7@test.org,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: \"mail=3@test.org"..., 78added: "mail=3@test.org,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
)      

如您所見,百分比線未發送到stdoutor stderr(僅供參考,我已使用已知的工作和失敗命令進行驗證,即2isstderr1is 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..

我的問題仍然存在,因為我不知道如何處理這些附加資訊。

你被一個有趣的行為咬傷了slapadd。開發人員的郵件列表上對此進行了討論。底線是,在重定向 stderr 時,進度表似乎被禁用,或者僅在 STDIN 是 tty 時才啟用(根據一些Google搜尋,我無法得出明確的結論 - 似乎你需要深入研究程式碼! )。

除此之外,你在正確的軌道上。對於第二季度;我不太確定您的問題,但是要將 STDERR 重定向到文件,只需執行slapadd -v ... 2>YOURFILE. 這樣你仍然可以在 STDOUT (1) 上使用 grep。

引用自:https://serverfault.com/questions/336141