mysqldumpがエラーを生成しない場合にのみ、sqlダンプを圧縮したいと思います。無効なパスワードを入力しましたが、まだgzipが実行されます。
mysqldump -u username -ppassword dbname |& if [ $? == 0 ]; then gzip > test.gz; else echo "error"; fi
私のコマンドに問題がありますか?それとも、より良い解決策がありますか?
答え1
削除できると思います|&
(理由は、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でディスクを埋める以外のほとんどの理由でバックアップが失敗した場合です。
答え2
あなたもできます
mysqldump -someparams dump.sql && gzip dump.sql || echo "Backup failed"
または
mysqldump -someparams dump.sql
[[ $? == 0 ]] && gzip dump.sql || echo "Backup failed "
答え3
パイプラインは両方を並列に実行します。これを行う方法は概念的に不可能です。mysqldump
このテストを実行と同時に実行すると、完了するまでコマンドの状態をテストできませんmysqldump
。を実行してmysqldump
完了するまで待ってから、それから実行するかどうかを決定しますgzip
。
mysqldump
実行が完了する必要があるため、出力はどこかに移動する必要があります。おそらく圧縮するので、出力が大きくなりたいと思うでしょう。したがって、圧縮するのが賢明です。したがって、出力は無条件に圧縮されます。
mysqldump -u username -ppassword dbname | gzip > test.gz
|
代わりにを使用したことに注意してください|&
。ここで使用することは意味がありません|&
。エラーメッセージが表示されると、最終的にダンプと混在してダンプを復元できなくなります。
残りの質問は、検出がmysqldump
成功したかどうかです。これがbashまたはkshスクリプトであると仮定します(つまり、ではなく#!/bin/bash
orなどで始まります)。#!/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
コマンドは、スクリプトが失敗した場合、またはリストされたシグナルのいずれかで終了した場合に一時ファイルが削除されるようにトラップを設定します。
答え4
一時ファイルを使用しない場合は、別の回避策は、エラーが発生したときに生成されたファイルを削除することです。
( 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