为了解决一些ftp连接错误,我被指示编写一个bash脚本,它将无限连接到一个远程frp服务器并从那里获得一个文件。
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
该脚本正常工作,但打印到屏幕上的wget行的输出也应该被logging到日志中,但由于某种原因,只有它不被写入日志。
例:
[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 =====------
你能find它没有写入日志的原因吗?
提前致谢,
原因在于虽然echo语句转到STDOUT ,因此通过pipe道发送到tee ,但是从wget命令看到的“输出”在STDERR ,而不是。
这不会默认通过pipe道,正如你所看到的,改为tty 。 如果要将STDOUT和STDERR 都发送到pipe道的STDIN ,则应使用|& ,例如
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
这在bash和tcsh,如果内存服务。 对于沼泽标准嘘这是一个更多的工作,但仍然可以完成(虽然我不能从我的头顶记住如何)。
编辑 (安东尼,其评论如下;谢谢! – MadHatter):
POSIX兼容shell的语法(也适用于sh )应该是:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log