stdout, stderr e o que mais? (indo insana análise slapadd saída)

1

Estou usando slapadd para restaurar um backup. Esse backup contém 45k entradas, o que demora um pouco para ser restaurado, portanto, preciso atualizar o progresso de slapadd . Felizmente para mim existe a opção -v que dá uma saída similar a esta:

added: "[email protected],ou=People,dc=example,dc=org" (00003d53)
added: "[email protected],ou=People,dc=example,dc=org" (00003d54)
added: "[email protected],ou=People,dc=example,dc=org" (00003d55)
.########              44.22% eta 05m05s elapsed             04m spd  29.2 k/s 
added: "[email protected],ou=People,dc=example,dc=org" (00003d56)
added: "[email protected],ou=People,dc=example,dc=org" (00003d57)
added: "[email protected],ou=People,dc=example,dc=org" (00003d58)
added: "[email protected],ou=People,dc=example,dc=org" (00003d59)

A cada N entradas adicionadas, slapadd escreve uma linha de saída de atualização de progresso ( .######## 44.22% eta 05m05s elapsed ... ) que eu quero manter e uma linha de saída para cada entrada criada que eu quero esconder porque expõe o endereço de e-mail das pessoas mas ainda quer contá-los para saber quantos usuários foram importados

A maneira como pensei em ocultar e-mails e mostrar a atualização do progresso é esta:

$ 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

Eu tentei variações diferentes das opções acima e, independentemente do que eu tente, não consigo usar a linha de saída de atualização do progresso.

Eu tracei slapadd da seguinte forma:

sudo strace slapadd -v ...

E aqui está o que eu recebo:

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
)      

Como você pode ver, a porcentagem de linha não é enviada para stdout ou stderr (FYI validamos com comandos conhecidos em funcionamento e com falha que 2 é stderr e 1 is stdout )

Q1: onde está indo a linha de saída de atualização de progresso?
Q2: Como posso fazer isso ao enviar stderr para um arquivo?

Informações adicionais: estou executando Openldap 2.4.21 on ubuntu server 10.04

1ª atualização: informações potencialmente relevantes

De link

("meter" é o que chamei acima da "linha de saída de atualização do progresso")

> 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..

Ainda restam minhas dúvidas, pois não sei o que fazer com essa informação adicional.

    
por Max 30.11.2011 / 10:58

1 resposta

2

Você foi mordido por um comportamento engraçado de slapadd . Houve uma discussão na lista de discussão do desenvolvedor sobre isso. A conclusão é que o medidor de pogress parece ser desabilitado quando redirecionar stderr ou é habilitado somente quando STDIN é um tty (não consegui chegar a uma conclusão definitiva com base em algumas pesquisas no google - parece que você precisa mergulhar no código!).

Além disso, você está no caminho certo. Para Q2; Não tenho tanta certeza sobre sua pergunta aqui, mas para redirecionar STDERR para um arquivo, basta fazer slapadd -v ... 2>YOURFILE . Desta forma, você ainda pode grep em STDOUT (1).

    
por 30.11.2011 / 11:20