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