일부 FTP 연결 오류를 해결하기 위해 원격 FRP 서버에 무한히 연결하고 거기에서 하나의 파일을 가져오는 bash 스크립트를 작성하라는 지시를 받았습니다.
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의 경우 작업이 조금 더 필요하지만 여전히 수행할 수 있습니다(비록 어떻게 하는지 기억이 나지 않지만).
편집하다(Anthony의 의견은 다음과 같습니다. 감사합니다! - MadHatter):
POSIX 호환 쉘( 에서도 작동함 sh
)의 구문은 다음과 같습니다.
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log