你给的Progressbar代码给了我一个关于没有PID的错误

时间:2010-11-21 15:14:58

标签: bash progress-bar

我是Linux的初学者,也是bash脚本的初学者。我正在尝试编写一个bash脚本来备份我的主目录并向我显示进度。我找到了一个名为bar的脚本,它允许我在缩小tar.bz2文件时显示进度条,但在创建一个时不显示。我找到了你的代码,我正在尝试它,但它给了我一个错误: lsof:没有指定进程ID lsof 4.81

我从这个页面转到你的代码: How to add a progress bar to a shell script? 这是代码:

#! /bin/bash
tar -jcf userhomeBU$(date +%Y&m&d)".tar.bz2" /home/user
lsof -o0 -o -p $PID |
awk '
            BEGIN { CONVFMT = "%.2f" }
            $4 ~ /^[0-9]+r$/ && $7 ~ /^0t/ {
                    offset = substr($7, 3)
                    fname = $9
                    "stat -f %z '\''" fname "'\''" | getline
                    len = $0
                    print fname, offset / len * 100 "%"
            }
    '

我的主目录备份得很好,但由于错误我没有进度条。

看起来这将使用PID来观察它何时完成。我认为它使用PID而不是文件的名称,因为在脚本的最开始名称将是未知的。你能否解释一下这个脚本到底做了什么,以及为什么我没有得到一个PID供它观看。我已将备份代码放在前面和末尾,但它没有显示条形,我只是在不同的时间得到相同的错误。

帮助!

3 个答案:

答案 0 :(得分:0)

以下是原始帖子中其中一个答案的改编。我测试了它,它可以在我的机器上运行:

tar -Ocf - /home/user | pv -i 1 -w 50 -berps `du -bs /home/user | awk '{print $1}'` | bzip2 - >  userhomeBU$(date +%Y%m%d)".tar.bz2"

答案 1 :(得分:0)

尝试将整个tar命令分配给变量,将变量传递给pidof:

...
TAR_CMD='tar -jcf userhomeBU$(date +%Y&m&d)".tar.bz2" /home/user'  
lsof -o0 -o -p `pidof -s $TAR_CMD` | \   
awk ...

答案 2 :(得分:0)

这不是一个非常大的家庭目录,但我有一些大文件。备份需要大约45秒,因为有几个iso,它在VM中。此外,我知道它没有工作,因为没有创建备份文件。脚本中没有& 。当我运行它时,我得到以下输出:

[1] stopped       tar -Ocf - /home/user | pv -i 1 -w 50 -berps 'du -bs /home/user | awk '{print $1}'' | bzip2 - > userBU(date +%Y%m%d)".tar.bz2" 
这只是我的代码的副本。每次运行时,[]中的数字增加1。代码中的第一个'和最后一个'实际上是tilda下的单个',但是`没有出现在这篇文章中。