Tar备份bash脚本中的奇怪行为

时间:2015-07-06 06:58:56

标签: linux bash shell awk

我有用于备份/目录的bash脚本,我正在使用管道查看器(pv)查看进度条。当我手动运行该命令时,它工作正常,但是当我在bash脚本中运行相同的命令时,进度条显示虽然ETA显示00:00达到100%但是它仍然继续下去,它会超过100%并最终达到108%。这是我的剧本

DIR_1="/var /root /sbin /bin /etc /lib /www /usr /mnt";

CAL_1=$(du -skc $DIR_1 | awk '{print $1}' | tail -n1);

    if [ "$1" = "fullbackup" ]                                                                            
    then                                                                                                  
            echo "`date +%F\ %H:%M` backup started..">>$FLOG;                                             
            /bin/nice -n 19 tar cf - `echo $DIR_1` | pv -s ${CAL_1}k >$DESTINATION/$FILENAME -f 2>$TARLOG;
            if [ $? -eq 0 ]                                                                               
            then                                                                                          
                    echo "`date +%F\ %H:%M` tar archive successfull" >>$FLOG ;                            
                    NEW=$(cd $DESTINATION && ls -t full* | head | sed '1!d');                             

            elif [ $? -ne 0 ]                                                                             
            then                                                                                          
                    echo "`date +%F\ %H:%M` tar archive failed">>$FLOG;                                   
                    rm $DESTINATION/$FILENAME;                                                            
                    exit;                                                                                 
            fi                                                              

1 个答案:

答案 0 :(得分:0)

这里发生了什么。您告诉 pv tar文件的大小是 $ DIR_1 下文件的总和,有时则不是。

特别是,当你运行程序并获得108%而不是100%时,8%的差异就是tar文件的开销。您可以通过将使用 $ CAL_1 获得的值与使用ls -l $DESTINATION/$FILENAME获得的值进行比较,轻松验证这一点。

du -k决定K的含义与 pv 衡量的方式之间也存在一些细微的差异。为消除这种可能性,请删除''来自 pv du

我认为以交互方式运行这是一个红色的鲱鱼。我猜测当你以交互方式运行时,你运行的是一个小的文件系统,其中tar开销接近于0,而当你在脚本中运行它是在一个大型文件系统上完成的。 (小文件系统是交互式的,因为谁想等几个小时才能得到结果?)。

要验证是否消除了交互式与脚本的情况,请确保在相同的文件系统上运行这两个。

如果没有这样做,我建议您在上面提到的具体输出中添加 $ CAL_1 的价值以及 ls的内容最终的tar文件是。