Перенаправление STDERR в файл Bash приводит к тому, что файл создается даже при отсутствии ошибок. Зачем? - PullRequest
1 голос
/ 10 августа 2009

Я создал небольшой скрипт Bash, который выполняет дамп данных MySQL. Поскольку дамп может быть довольно большим, я помещаю процесс в фоновый режим и затем жду, пока в файловой системе не появится сообщение об ошибке или журнал. У меня есть следующий код:

mysqldump main_db > /loc/to/dmp/file.sql 2>/loc/to/error/log/file.log &

Проблема в том, что иногда я получаю файл '/loc/to/error/log/file.log' размером 0 (что, как я полагаю, означает отсутствие реальной ошибки), иногда при выполнении этой команды, которая убивает процесс, хотя ошибки нет.

Я не уверен, почему STDERR записывал файл, когда не было данных для записи. Это из-за & фонового процесса?

Ответы [ 3 ]

5 голосов
/ 10 августа 2009

Перенаправленные файлы настраиваются перед выполнением сценария исполняемой оболочкой.

т.е. После анализа вашей команды, которая включает перенаправленный stdout / stderr, открывается оболочка вилки (создает файлы, если их не существует). присоедините открытые файловые дескрипторы к файловым дескрипторам 1 и 2 (соответственно stdout / err) и затем выполните фактическую команду.

0 голосов
/ 01 апреля 2016

Возможное простое решение:

mysqldump main_db > file.sql 2> errors.log ; [ -s errors.log ] || rm -f errors.log

OR
(кратко читаемый, легко настраиваемый скрипт с отметкой времени)

OUTPUT="/loc/to/dmp/`date +%F.%T`.sql"
ERRORS="$OUTPUT.ERRORS"
mysqldump main_db > $OUTPUT 2> $ERRORS
[ -s $ERRORS ] || rm -f $ERRORS
0 голосов
/ 10 августа 2009

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

...