8
respostas

pegar retorno de execução wget

Olá professor,

Com os conhecimentos do curso, estou criando um script para fazer download de arquivos.

A questão é que esses downloads podem demorar e estou utilizando wget e quero ter a certeza que o download foi finalizado com sucesso.

Minha dúvida é: o que usar no script para recuperar o retorno de wget depois desse longo tempo de download e confirmar o fim da operação? 2>log_erros.txt não está recuperando o erro. Ele pode ser usado desta forma?

#!/bin/bash

wget asdff  -o log.txt

if [ $? -eq 0 ]
then
    echo "download efetuado com sucesso"
else
    echo "falha no download"
fi

2>log_erros.txt
8 respostas

Olá, Rafael. Tudo bem?

O 2> faz o redirecionamento da saída padrão de erros, mas o que está acontecendo nesse caso é que, quando o interpretador chega na última linha, não há nenhum redirecionamento de erro para acontecer.

Se você quiser que um possível erro no wget seja mandado para esse arquivo log_erros.txt, você deve adicionar o redirecionamento após o próprio wget.

wget asdff 2>log_erros.txt

No entanto, como você está usando a opção -o, qualquer log será direcionado para o arquivo que você definiu. Então se você quiser checar os erros, eles já devem estar aparecendo no próprio arquivo log.txt.

Espero ter ajudado. Se tiver alguma, dúvida é só dizer.

Olá, Vitor

Retirei a opção -o e deixei apenas 2>nome_arq.txt

Acontece que ele loga todo tipo de mensagem e não apenas erros. Na aula deu a entender que usar 2 iria logar apenas retornos de erro.

Na própria documentação do wget diz os Exit Status. Segue:



2.13 Exit Status
Wget may return one of several error codes if it encounters problems.

0
No problems occurred.

1
Generic error code.

2
Parse error—for instance, when parsing command-line options, the ‘.wgetrc’ or ‘.netrc’...

3
File I/O error.

4
Network failure.

5
SSL verification failure.

6
Username/password authentication failure.

7
Protocol errors.

8
Server issued an error response.

Outra dúvida seria em como logar outros tipos de exit status em arquivos diferentes?

Oi, Rafael.

Na verdade, todas essas saídas que você mostrou são saídas de erro. Repare que cada uma delas é de um erro diferente. Na documentação da ferramenta tem uma seção sobre os Exit Status:(https://www.gnu.org/software/wget/manual/html_node/Exit-Status.html). Nesse caso aí, todos os erros ocorrem.

Acho que a única forma de loggar uma mensagem de erro diferente para cada status é fazendo com if ou case mesmo.

Oi, Rafael.

Na verdade, todas essas saídas que você mostrou são saídas de erro. Repare que cada uma delas é de um erro diferente. Na documentação da ferramenta tem uma seção sobre os Exit Status:(https://www.gnu.org/software/wget/manual/html_node/Exit-Status.html). Nesse caso aí, todos os erros ocorrem. O único status que não é de erro é o 0.

Acho que a única forma de loggar uma mensagem de erro diferente para cada status é fazendo com if ou case mesmo.

Vitor, faltou um detalhe na mensagem anterior.

usando "2>nome do arquivo" está logando todas as mensagens do wget e não apenas as de erro.

pensei que ao usar "2>saida" apenas o exit status 2 seria capturado.

Olá, Rafael.

Entendi agora.

Pelo que vi no manual do wget, todas as mensagens dele são enviadas ao STDERR, mesmo as que não são erros. Então, com ele, não vai dar pra redirecionar para lugares diferentes.

Mas caso você queira fazer com um comando que envie erros e logs normais para saídas diferentes, dessa forma deve funcionar:

wget url 2> log_erro 1> log

Show Vitor,

Assim que conseguir, vou fazer as alterações.

Mais um detalhe. Hoje estou enviando um texto fixo de email em caso de erro. Como posso fazer com que o conteudo do arquivo txt seja mandado por email?

$saida = $?
mail -s "Problema Download " rafael@email.com<<del
houve um problema no download. exit code $saida
del

é possível fazer conforme abaixo?

$saida = $?
$logErro = $(cat log_err.txt)
mail -s "Problema Download " rafael@email.com<<del
houve um problema no download. exit code $saida.
$logErro
del

Olá, Rafael.

Em tese, o cat deve funcionar sim, mas também é possível usar um recurso próprio do shell que é o redirecionamento de input, usando o operador <

$logErro = $(<log_err.txt)

Já que a finalidade do cat é concatenar arquivos, a comunidade de shell script considera, de certa forma, um mal uso do cat usar ele só para pegar o valor de um arquivo. Mas, de fato, o resultado é o mesmo.