繁体   English   中英

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

[英]Tar backup strange behaviour in bash script

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

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                                                              

这是怎么回事。 您是在告诉pv tar文件的大小是$ DIR_1下文件的总和,有时不是。

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

du -k决定K的含义与pv对其进行测量的方式也可能存在一些差异。 为了消除这种可能性,请同时删除pvdu中的“ k”。

我认为以交互方式运行它是一个红鲱鱼。 我猜想,当您以交互方式运行时,您会在tar开销接近于0的小型文件系统上运行,而当您在脚本中运行时,它是在大型文件系统上运行的。 (小型文件系统是交互式执行的操作,因为谁想要等待几个小时才能获得结果?)。

要验证消除交互还是脚本情况,请确保您在同一文件系统上运行两者。

如果这样做不能解决问题,建议您将上述提到的特定输出添加到您的问题中,例如$ CAL_1的值是什么以及最终tar文件的ls是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM