Para solucionar algún error de conexión ftp, me han indicado que escriba un script bash que se conectará infinitamente a un servidor frp remoto y obtendrá un archivo desde allí.
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
El script funciona correctamente, pero se supone que la salida de la wget
línea que se imprime en la pantalla también se envía tee
al registro, pero por alguna razón no se escribe en el registro.
Ejemplo:
[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 =====------
¿Puede encontrar el motivo por el cual no está escrito en el registro?
Gracias de antemano,
Respuesta1
La razón es que aunque las echo
declaraciones van a STDOUT
y, por lo tanto, se envían a través de la tubería a tee
, la "salida" que estás viendo del wget
comando está activada STDERR
, lo cual no es así.
Esto no pasa por una tubería de forma predeterminada, sino que, como vio, en tty
su lugar. Si quieres enviarambos STDOUT
y STDERR
para una tubería STDIN
, deberías usar |&
, por ejemplo
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
Eso funciona en bash y tcsh, si la memoria no me falla. Para los peces estándar de pantano es un poco más trabajo, pero aún se puede hacer (aunque no puedo recordar cómo).
Editar(por Anthony, cuyo comentario sigue; ¡gracias! - MadHatter):
La sintaxis para shells compatibles con POSIX (también debería funcionar para sh
) sería:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log