有没有办法让 tar 在切换磁带驱动器时执行脚本?

有没有办法让 tar 在切换磁带驱动器时执行脚本?

我的公司有一个双戴尔 LTO-7 驱动器。我最近发现可以按顺序自动备份两个磁带:

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

出色的。每盘磁带原生容量为 6TB,我们假设gigantic10TBfile.bin不压缩,当磁带/dev/nst0满了时,tar 会自动在磁带上移动/dev/nst1,而我不必离开椅子。

现在,实际上,它不是一个巨大的文件,而是数千个较小的文件。我tee将 tar 的输出保存到日志文件中以查看情况如何。在跨多个磁带进行传输的情况下,我希望在此日志文件中添加一个条目,说明“磁带更改”或其他内容。

输入--new-volume-script(也称为--info-scriptor -F、 docs这里)。耶。除非它没有被执行。让我们做一个更易于管理的例子:

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.tartarball2.tar已创建,并且 tar“用完了”目标文件。

所以,我的问题是,是否可以选择在写入tarball1.tar和之间执行脚本tarball2.tar

答案1

事实上,它仅在目标文件用完时执行tar,因此为了在每次创建卷时运行脚本,您必须在命令中仅使用一个目标文件,例如

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

并让脚本创建其他档案。该脚本继承了tar的 shell 环境,并通过环境变量将附加数据传递给它,例如:

TAR_ARCHIVE正在处理的
存档的名称tar

TAR_VOLUME即将启动的
卷的序号。tar

TAR_FD
文件描述符,可用于将新卷名称传达给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/nst0连续编号的档案,则必须在传递卷名称时减去1TAR_VOLUME 例如TAR_FD将最后一行更改为

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

如果您只有两个始终命名为 和 的磁带机/dev/nst0,并且/dev/nst1希望脚本在其中一个或另一个用作初始--file参数时工作,则可以从 的当前值中提取驱动器号TAR_ARCHIVE,并在以下情况下使用另一个驱动器号:将下一个存档名称写入TAR_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

这将创建两个存档,/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

相关内容