Ошибка:
rc=$( curl ... )
Это дало Мне вернули код http, потому что я заполнил $ rc
стандартным выводом curl. После этого я должен заполнить rc
с помощью $?
.
После изменения кода на:
httprc=$( curl ...)
rc=$?
мне вернули оба кода возврата. Спасибо meuh !
Я думаю, вы могли бы удалить|&
(причину того, что вам не нужно передавать ни 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.
Вы также можете
mysqldump -someparams dump.sql && gzip dump.sql || echo "Backup failed"
Или
mysqldump -someparams dump.sql
[[ $? == 0 ]] && gzip dump.sql || echo "Backup failed "
Труба проходит с двух сторон параллельно. Способ, которым вы пытаетесь это сделать, концептуально невозможен :вы не можете проверить статус команды 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
устанавливает ловушку, так что в случае сбоя сценария или его уничтожения одним из перечисленных сигналов временный файл удаляется.
Вы также можете использовать сборку bash -в таблице $PIPESTATUS[x] для перехвата ошибок.
например:
$ cmd1 | cmd2 | cmd3 |..
и т.д..
Тогда вы увидите, какая команда не удалась
Если вы хотите избежать использования временного файла, другим решением является удаление результирующего файла при ошибке:
( 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