Чтобы устранить некоторые ошибки 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
команды, находится в STDERR
, что не так.
По умолчанию это не проходит через канал, а идет - как вы видели - в tty
. Если вы хотите отправитьоба STDOUT
и STDERR
для трубы STDIN
, вы должны использовать |&
, например
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log
Это работает в bash и tcsh, если мне не изменяет память. Для стандартного sh это немного сложнее, но все равно можно сделать (хотя я не могу вспомнить, как).
Редактировать(от Энтони, чей комментарий следует; спасибо! - MadHatter):
Синтаксис для оболочек, совместимых с POSIX (также должен работать для sh
), будет следующим:
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log