Как выполнить сжатие только в том случае, если mysqldump не выдает ошибок?

Ошибка:

rc=$( curl ... )

Это дало Мне вернули код http, потому что я заполнил $ rc стандартным выводом curl. После этого я должен заполнить rc с помощью $? .

После изменения кода на:

httprc=$( curl ...)
rc=$?

мне вернули оба кода возврата. Спасибо meuh !

3
10.08.2017, 02:22
5 ответов

Я думаю, вы могли бы удалить|&(причину того, что вам не нужно передавать ни stdout, ни stderr в следующее условное выражение, во всяком случае, вы можете просто использовать ';' как разделитель команд ). Что-то вроде этого, вероятно, должно работать:

#!/bin/bash
mysqldump -u myuser -p mypasswd > mydb.dump
if [[ $? -eq 0 ]]; then
    gzip mydb.dump
else 
    echo >&2 "DB backup failed" 
    exit 1
fi

Отредактируйте :, чтобы проверить успешность gzip, вы можете сделать что-то вроде этого:

mysqldump -u myuser -p mypasswd | gzip > mydb.dump.gz && echo "success" || echo "failure" 

Однако это сообщит об успешном выполнении, даже если mysqldumpне удалось, т. е. если резервное копирование завершилось неудачно по большинству причин, кроме заполнения диска gzip.

4
27.01.2020, 21:09

Вы также можете

mysqldump -someparams dump.sql && gzip dump.sql || echo "Backup failed"  

Или

mysqldump -someparams dump.sql  
[[ $? == 0 ]] && gzip dump.sql || echo "Backup failed "
3
27.01.2020, 21:09

Труба проходит с двух сторон параллельно. Способ, которым вы пытаетесь это сделать, концептуально невозможен :вы не можете проверить статус команды mysqldumpдо ее завершения, если вы выполняете этот тест параллельно с выполнением mysqldump. Вам нужно запустить mysqldump, дождаться его завершения и , затем решить, запускать ли gzip.

Поскольку mysqldumpдолжен закончить работу, его вывод должен куда-то идти. Предположительно, вы ожидаете, что результат будет большим, так как вы его сжимаете. Поэтому разумный вариант — сжать его. Поэтому безоговорочно сжимайте вывод.

mysqldump -u username -ppassword dbname | gzip > test.gz

Обратите внимание, что я использовал |, а не |&. Использование |&здесь не имеет смысла :если есть какие-либо сообщения об ошибках, они в конечном итоге смешаются с дампом, и восстановить дамп будет невозможно.

Проблема, которую еще предстоит решить, заключается в том, чтобы определить, удалось ли mysqldump. Предполагая, что это сценарий bash или ksh (, т. е. он начинается с #!/bin/bashили #!/bin/kshили подобного, а не с #!/bin/sh), установите параметр pipefail, чтобы конвейер давал сбой при сбое какой-либо части. (По умолчанию состоянием конвейера является состояние его самой правой команды, а состояние других команд игнорируется.)

#!/bin/bash
set -o pipefail -o errexit
tmp="mydump.tmp.$$.gz"
trap 'rm -f "$tmp"' ERR INT TERM HUP
mysqldump … | gzip >"$tmp"
mv "$tmp" mydump.gz

Установка параметра errexitгарантирует, что в случае сбоя конвейера сценарий завершится в этой точке (с тем же статусом ошибки, что и конвейер ). Таким образом, файл с именем mydump.gzсоздается только в случае успешного создания дампа. Команда trapустанавливает ловушку, так что в случае сбоя сценария или его уничтожения одним из перечисленных сигналов временный файл удаляется.

2
27.01.2020, 21:09

Вы также можете использовать сборку bash -в таблице $PIPESTATUS[x] для перехвата ошибок.

например:

$ cmd1 | cmd2 | cmd3 |..
  • статус cmd1 будет в переменной $PIPESTATUS[0]
  • статус cmd2 будет в $PIPESTATUS[1]

и т.д..

Тогда вы увидите, какая команда не удалась

2
27.01.2020, 21:09

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

( mysqldump... || rm -f test.gz ) | gzip > test.gz

Или, если вы хотите иметь явный флаг, что-то вроде этого:

rm -f test.ok
( mysqldump... && touch test.ok ) | gzip > test.gz
if [[ $? -eq 0 && -r test.ok ]]; then
    echo it worked
else
    echo something went wrong
fi
0
27.01.2020, 21:09

Теги

Похожие вопросы