Как передать весь вывод терминала, включая сообщения об ошибках, из сценария в файл журнала

Я пытаюсь создать читаемый файл журнала для большого сценария резервного копирования.
Внутри сценария я просто перенаправляю весь вывод команд в большой файл, который затем может быть «очищен» сценарием. Например:

echo "Error occurred" >> log.file
mount disk >> log.file

Предупреждения и ошибки, которые я пропустил, я показываю на консоли при выполнении скрипта.

backup.script >> log.file

Но даже если сообщения об ошибках не всегда регистрируются в моем файле, при выполнении скрипта (с конвейером) cron я получаю письма от rsync и ошибки скрипта:

rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
rsync: write failed on "/mnt/backup1/xxxxx": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(322) [receiver=3.0.9]
rsync: connection unexpectedly closed (215 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

и при возникновении ошибки скрипта:

/data/scripts/backup.auto: line 320: syntax error near unexpected token `else'

Как я могу включить эти сообщения об ошибках в свой файл журнала?


person Requist    schedule 04.03.2014    source источник
comment
Скажите >> log.file 2>&1 вместо >> log.file.   -  person devnull    schedule 04.03.2014
comment
Я в офисе, поэтому не могу попробовать (здесь нет Linux), но причина в том, что используются разные файловые дескрипторы. devnull только что дал ответ на это. Кстати, порядок >> и 2>&1 важен.   -  person Axel    schedule 04.03.2014
comment
3 ответа за одну минуту, это то, что я называю быстрым ответом! Спасибо   -  person Requist    schedule 04.03.2014
comment
Обратите внимание, что вы можете очистить свой сценарий, сгруппировав последовательные команды, которые записывают в один и тот же файл: echo foo >> log.file; echo bar >> log.file станет { echo foo; echo bar; } >> log.file.   -  person chepner    schedule 04.03.2014
comment
См. Также teelog в разделе how-do-i-get-both-stdout-and-stderr-to-go-to-the-terminal-and-a-log-file stackoverflow.com/questions/363223   -  person denis    schedule 07.05.2014


Ответы (1)


Чтобы перенаправить STDERR в STDOUT, вы должны добавить 2>&1 в конце каждой строки

echo "Error occurred" >> log.file 2>&1
mount disk >> log.file 2>&1

Если у вас несколько файловых дескрипторов, просто перенаправьте их все на stdout 3> & 1…

Изменить: когда я не помню, как работают дескрипторы файлов, я перехожу к http://www.tldp.org/LDP/abs/html/io-redirection.html

person fredtantini    schedule 04.03.2014
comment
Как всегда, поиск - это скорее проблема, чем решение. Работает отлично, спасибо, также за сайт, которого еще нет в моих избранных. - person Requist; 04.03.2014