Para solucionar alguns erros de conexão FTP, fui instruído a escrever um script bash que se conectará infinitamente a um servidor frp remoto e obterá um arquivo de lá.
ftpuser="ftpuser"
ftppasswd="ftppasswd"
ftpsrv="download.akamai.com"
log="/var/log/test_ftp_akamai.log"
function print_log {
echo $(date +'%d-%m-%y %H:%M:%S') $* >> $log
}
while true
do print_log "-----===== Start =====------" | tee -a $log
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv | tee -a $log
sleep 2 | tee -a $log
print_log "-----===== Done =====------" | tee -a $log
done
O script funciona corretamente, mas a saída da wget
linha impressa na tela também deve ser tee
inserida no log, mas por algum motivo ela não está sendo gravada no log.
Exemplo:
[root@sjorigin1 ~]# tailf /var/log/test_ftp_akamai.log
25-02-15 02:10:31 -----===== Start =====------
25-02-15 02:10:33 -----===== Done =====------
25-02-15 02:10:33 -----===== Start =====------
25-02-15 02:10:35 -----===== Done =====------
Você consegue descobrir o motivo pelo qual não está gravado no log?
Desde já, obrigado,
Responder1
A razão é que, embora as echo
instruções vão para STDOUT
e, portanto, sejam enviadas através do canal para tee
, a "saída" que você vê do wget
comando é on STDERR
, o que não acontece.
Isso não passa por um cano por padrão, mas sim - como você viu tty
. Se você quiser enviarambos STDOUT
e STDERR
para um pipe STDIN
, você deve usar |&
, por exemplo
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
Isso funciona em bash e tcsh, se não houver memória. Para bog standard sh é um pouco mais trabalhoso, mas ainda pode ser feito (embora eu não consiga lembrar como).
Editar(por Anthony, cujo comentário segue; obrigado! - MadHatter):
A sintaxe para shells compatíveis com POSIX (também deve funcionar para sh
) seria:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log