次のようにmysqlバックアップファイルをパッケージ化しようとしています。
find /data/mysqldata \( ! -name "*mysql-bin*" -a ! -name "*.log" \) |
xargs tar -zcf /data/backup.tgz
実際にこのコマンドをPopenで実行し、select-poll方式で出力が読み込まれるのを待っていましたが、tarプログラムを再起動したかのようにバックアップファイルが大きくなりすぎて、突然小さすぎる場合がありました。これは通常、ターゲットファイルが非常に大きく混乱している場合に発生します。
答え1
GNUの使用tar
:
tar -cz -f /data/backup.tgz --exclude '*.log' --exclude 'mysql-bin.*' /data/mysqldata
あなたが経験している問題は、xargs
それをtar
複数回(少なくとも2回)実行することです。バックアップファイルは、2回目の実行時にtar
「縮小」(上書き)されます。
それがまさにそのことですxargs
。できるだけ多くの引数を使用してユーティリティを実行し、より多くの引数(あなたのファイル名)を取得したら、リストを切り取り、ユーティリティへの他の呼び出しでリストを引き続き使用します。
質問起こったすべてのディレクトリとファイル名をに送信するため、xargs
非常に長いリストが生成されます。
答え2
xargs
(場合によっては)リストを複数のアーカイバー呼び出しに分割するのではなく、ファイルリストをarchiveコマンドに直接パイプします。
ここでは標準コマンドを使用しますが、pax
一部のコマンドは安定性を向上させるために非標準拡張を-print0
サポートしています。-0
find /data/mysqldata ! -name "*mysql-bin*" ! -name "*.log" -print0 |
pax -0wd | gzip > file.tar.gz
(-d
これを使用しないと、すべてのファイルが含まれます。アーカイブ(除外パターンと一致しない)は、メソッドのようにすべてを/data/mysqldata
アーカイブtar
することを意味するためです。)
これに加えて、pax
多くのtar
実装が標準入力からファイルリストを取得することをサポートしていますが、実装間でインタフェースが異なることがよくあります。