Bash: Вывод команды записывается только на экран, а не в другой файл при использовании tee, в чем может быть причина?
Для того, чтобы устранить некоторые ошибки подключения 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