テープドライブを切り替えるときにtarにスクリプトを実行させる方法はありますか?

テープドライブを切り替えるときにtarにスクリプトを実行させる方法はありますか?

当社にはデュアルDell LTO-7ドライブがあります。最近、2つのテープを順次自動バックアップできることがわかりました。

tar -cv --multi-volume --file=/dev/nst0 --file=/dev/nst1 gigantic10TBfile.bin

素晴らしい。各テープのデフォルト容量は6 TBで、gigantic10TBfile.binテープがいっぱいになると、席を離れることなく/dev/nst0自動的にtarがテープの上を移動します。/dev/nst1

実際には1つの巨大なファイルではなく、何千もの小さなファイルです。tee状況がどのように進行したかを確認するために、tarの出力をログファイルに保存しました。複数のテープにわたって転送する場合は、「テープが変更されました」というエントリをこのログファイルに追加したいと思います。

入力(または文書--new-volume-scriptとも呼ばれる)--info-script-Fここ)。うん。実行されない限り。もっと管理しやすい例を作りましょう。

tar -cvlp --multi-volume --new-volume-script="./new_volume_script.sh" --file=tarball1.tar --file=tarball2.tar --tape-length=4M 10MBrandom.bin

この例を実行すると、--new-volume-script一度だけ実行されtarball1.tar生成さtarball2.tarれ、tarはターゲットファイルで「実行」されます。

tarball1.tarだから私の質問は、書き込みとの間でスクリプトを実行するオプションはありますかtarball2.tar

ベストアンサー1

実際にはターゲットファイルが使い果たされた場合にのみ実行されるため、ボリュームが作成tarされるたびにスクリプトを実行するには、コマンドに1つのターゲットファイルを使用する必要があります。

tar -cv -M -F './my_script.sh' --file=/dev/nst1 --tape-length=4M 10MBrandom.bin

スクリプトに別のアーカイブを作成させます。スクリプトはtarシェル環境を継承し、環境変数を介して追加のデータを渡します。例:

TAR_ARCHIVE処理中の
アーカイブの名前tar

TAR_VOLUME起動するボリュームのシリアル番号
tar


新しいボリューム名tarを。

だからこんなスクリプト

#! /bin/bash

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
name=${TAR_ARCHIVE%?}
echo ${name}$TAR_VOLUME >&$TAR_FD

他のアーカイブが作成および作成されるたびに実行されます/dev/nst2。 (/dev/nst3つまり、コマンドで指定された初期ボリュームを介して)TAR_VOLUMEから始まります。連続した番号のアーカイブを使用するには、ボリューム名を渡すときに減算する必要があります。たとえば、最後の行を次のように変更します。1--file=--file=/dev/nst01TAR_VOLUMETAR_FD

echo ${name}$((TAR_VOLUME - 1)) >&$TAR_FD

常に名前付きの2つのテープドライブのみがあり、どちらかが初期引数として使用されているときにスクリプトが機能するようにするには、現在の/dev/nst0値からドライブ文字を抽出し、次の別のドライブ文字を使用できます。次のアーカイブ名を次に書きます。/dev/nst1--fileTAR_ARCHIVETAR_FD

#! /bin/bash

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

drive=${TAR_ARCHIVE: -1}

case "$drive"  in
0)  other=1     ;;
1)  other=0     ;;
*)       exit 1
esac

echo "${TAR_ARCHIVE%?}${other}" >&$TAR_FD

これにより、2つのアーカイブが作成され、/dev/nst1その逆も同様です/dev/nst0。最初のアーカイブは、コマンドラインで指定したアーカイブです。--file


ちなみに、以下はマニュアルの引用です(セクション9.6.1)ここに提供されているサンプルスクリプトを含みます。

最も柔軟な方法は、ファイル記述子に新しいアーカイブ名を書き込むボリュームスクリプトを使用することです$TAR_FD。たとえば、次のボリュームスクリプトは、次の一連のアーカイブファイルを生成します。 「アーカイブボリューム」、どこファイル作成されるアーカイブの名前(--fileオプションとして提供)ロール生成されるアーカイブのシリアル番号。

#! /bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
          ;;
*)        exit 1
esac

echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

おすすめ記事