【问题标题】:Progressbar code you gave gives me an error about no PID你给的进度条代码给了我一个关于没有 PID 的错误
【发布时间】:2026-01-11 05:35:02
【问题描述】:

我是 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 | 啊啊啊 开始 { CONVFMT = "%.2f" } $4 ~ /^[0-9]+r$/ && $7 ~ /^0t/ { 偏移量 = substr($7, 3) fname = $9 "stat -f %z '\''" fname "'\''" |获取线 长度 = $0 打印 fname, offset / len * 100 "%" } '

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

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

救命!

【问题讨论】:

    标签: bash progress-bar


    【解决方案1】:

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

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

    【讨论】:

    • 这里假设只有一个tar 进程。如果还有其他人,pidof 将返回两个 pid。
    • 如果我将 tar cmd 分配给 var,如何使用 var 调用 cmd 以使其真正运行 cmd?
    【解决方案2】:

    这是对您原始帖子中其他答案之一的改编。我对其进行了测试,它可以在我的机器上运行:

    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"
    

    【讨论】:

    • 这没有显示任何进展。不知道我做错了什么。
    • 更改答案以使用不同的方法。
    • 另外,我必须使用 %m%d 而不是 &m&d 才能使 date 命令起作用。
    • 我有'而且应该有`。它只是说 [2] 停止了“大长命令”有什么想法吗?
    • 每次运行时,[] 中的数字都会增加 1,但仍然显示已停止。
    【解决方案3】:

    它不是一个很大的主目录,但我有几个大文件。由于有一些iso,备份大约需要45秒,并且它位于VM中。另外,我知道它不起作用,因为没有创建备份文件。脚本中没有&。当我运行它时,我得到以下输出:

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

    【讨论】:

      最近更新 更多