Назад | Перейти на главную страницу

stdout, stderr и что еще? (безумный синтаксический анализ вывода slapadd)

Я использую slapadd восстановить резервную копию. Эта резервная копия содержит 45 тыс. Записей, восстановление которых требует времени, поэтому мне нужно получить некоторые обновления от slapadd. К счастью для меня есть -v переключатель, который дает результат, аналогичный этому:

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

Я пробовал разные варианты вышеперечисленного, и что бы я ни пробовал, я не могу найти строку вывода обновления прогресса.

Я проследил 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
)      

Как видите, процентная линия тоже не отправляется stdout или stderr (К вашему сведению, я проверил известные рабочие и неудачные команды, которые 2 является stderr и 1 является stdout)

Q1: Куда идет строка вывода обновления прогресса?
Q2: Как я могу использовать grep при отправке stderr в файл?

Дополнительная информация: я бегу Openldap 2.4.21 на ubuntu server 10.04

1-е обновление: потенциально актуальная информация

Из 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 является терминалом (я не смог прийти к окончательному выводу на основе нескольких поисковых запросов в Google - кажется, вам нужно погрузиться в код!).

В остальном вы на правильном пути. За 2 квартал; Я не уверен в вашем вопросе, но для перенаправления STDERR в файл просто выполните slapadd -v ... 2>YOURFILE. Таким образом, вы все еще можете использовать команду grep для STDOUT (1).