tarファイルにプロセス出力を含める

tarファイルにプロセス出力を含める

圧縮tarファイルを作成し、バックアップ用に外部サーバーにアップロードする単純なbashスクリプトがあります。サーバー上のファイルに加えて、mysqlデータベースのいくつかのダンプも含めたいと思います。

ディスクスペースの制約のため、tarアーカイブを作成する前に、ディスク上のファイルのデータベースダンプを事前に作成することはできません。私がしたいことは何とかダンプをtarに直接転送することです。

私の最初の試みは、名前付きパイプを作成し、tarにそれを読み込むことでした。ダンプするデータベースごとにmysqldumpプロセスのパイプを作成します。

mkfifo $DB.sql
mysqldump --result-file=$DB.sql $DB &
echo $DB.sql >>$FILELIST

バックアップするすべてのファイルのリストを作成した後:

tar c -P --files-from=$FILELIST | gzip | curl ...

私はこれが期待どおりに機能しないことがわかりました。 tar はパイプの内容を読み取る代わりに、単にアーカイブにパイプエントリを作成します。

動作を変更する tar スイッチが見つかりません。 tarがパイプをファイルであるかのように読み取る方法はありますか?それとも、この種の状況を処理できる他のユーティリティはありますか?

答え1

使えばいいと思います。ヒューズファイルシステムと同様のことは、これが原則として問題があり、できないことに気づきました。

tar出力をリモートシステムに出力するには、出力を使用する必要があります。これは、出力を正確に順番に書き込むことができることをcurl意味します。tarしかし、ファイルtar形式アーカイブの各メンバーの前には、これを説明し、何よりもメンバーのサイズを含むヘッダーを含める必要があります。ただし、メンバーファイル自体の内容をパイプから取得すると、サイズが事前tarにわからないため、ヘッダーを書き込むことができず、ファイルデータの処理が続行されます。

答え2

これがあなたが望むものであるかどうかはわかりません。パイプから読み取るとは、標準入力から読み取ることを意味します。これは、標準入力が表示されるtar xf -(または圧縮された)ストリームを使用tar xzf -して行われます。-標準出力に書き込むのと似ています:(tar cf -またはtar czf -)。

関連情報