Um einige FTP-Verbindungsfehler zu beheben, wurde mir aufgetragen, ein Bash-Skript zu schreiben, das sich unendlich oft mit einem Remote-FRP-Server verbindet und von dort eine Datei abruft.
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
Das Skript funktioniert ordnungsgemäß, aber die Ausgabe der wget
auf dem Bildschirm gedruckten Zeile sollte auch tee
in das Protokoll geschrieben werden, wird aber aus irgendeinem Grund nicht in das Protokoll geschrieben.
Beispiel:
[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 =====------
Können Sie den Grund dafür finden, dass es nicht ins Protokoll geschrieben wird?
Dank im Voraus,
Antwort1
Dies liegt daran, dass die echo
Anweisungen zwar an gehen STDOUT
und somit durch die Pipe an gesendet werden tee
, die „Ausgabe“, die Sie vom wget
Befehl sehen, jedoch auf lautet STDERR
, was nicht der Fall ist.
Dies geht standardmäßig nicht durch eine Pipe, sondern - wie Sie gesehen haben - tty
stattdessen an. Wenn Sie senden möchtenbeide STDOUT
und STDERR
für das einer Pipe STDIN
sollten Sie verwenden |&
, zB
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
Das funktioniert in Bash und Tcsh, wenn ich mich recht erinnere. Für das Standard-SH ist es etwas mehr Arbeit, aber es ist trotzdem machbar (obwohl mir nicht spontan einfällt, wie).
Bearbeiten(von Anthony, dessen Kommentar folgt; Danke! – MadHatter):
Die Syntax für POSIX-kompatible Shells (sollte auch für funktionieren sh
) wäre:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log