Здесь исходный исходный код (соответствующий 30 строк bash
кода выделен)
Здесь упрощенный (s3
- двоичный файл, который передает данные в хранилище объектов). Точки (...) - это параметры, не размещенные здесь.
PULSE=$(mktemp -t shield-pipe.XXXXX)
trap "rm -f ${PULSE}" QUIT TERM INT
set -o pipefail
mysqldump ... | tee >(tail -c1 >$PULSE) | bzip2 | s3 stream ...
Как это работает? Можете ли вы объяснить мне, как работают эти перенаправления и трубы? Как отладить ошибку mysqldump: Got errno 32 on write
. При вызове вручную (только) mysqldump
никогда не прерывается с ошибкой.
Трудная часть состоит в том, что:
tee
записывает на стандартный вывод, а также файл>( cmd )
создает замещаемую замену процесса (команда, которая имитирует поведение записываемого файла) Это используется для эффективной передачи вывода mysqldump
в две другие команды: tail -c1
для печати последнего байта в файл и bzip2
для сжатия потока.
Как отметил Инян в комментариях, ошибка 32 исходит из сломанной трубы. Я предполагаю, что это происходит из-за прекращения s3 stream
(может быть, тайм-аута?), Что, в свою очередь, приводит к сбою предыдущих команд в конвейере.
bzip2
завершил работу, закрыв один конец канала для чтения, ноmysqldump
продолжал записывать данные в канал