為了解決一些 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
也應該被tee
寫入日誌,但由於某種原因,它沒有被寫入日誌。
例子:
[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 =====------
能找到沒有寫入日誌的原因嗎?
先謝,
答案1
原因是,雖然echo
語句轉到STDOUT
,並因此通過管道發送到tee
,但您從命令中看到的“輸出”wget
是 on STDERR
,但事實並非如此。
預設情況下,它不會通過管道,而是 - 正如您所看到的 - 而是通過管道tty
。如果您想發送兩個都 STDOUT
對於STDERR
管道STDIN
,您應該使用|&
,例如
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
如果沒記錯的話,這在 bash 和 tcsh 中是有效的。對於沼澤標準 sh 來說,這需要更多的工作,但仍然可以完成(儘管我無法立即記住如何完成)。
編輯(安東尼的評論如下;謝謝!-MadHatter):
POSIX 相容 shell 的語法(也應該適用於sh
)是:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log