如何监控Linux命令的进度(使用pv和Progress)

不是盲目操作,而是使用Linux pv和Progress命令来跟踪命令的进度。对于通常没有进度条的命令,这些实用程序将为您提供进度条。您还将看到完成之前的估计时间。

如果你乘坐的是一架座椅上没有视频屏幕的长途飞机,要知道你的旅程有多远并不容易。你知道你什么时候起飞的。你知道飞行预计需要多长时间。但是你怎么知道你是在正轨上、准时还是远远落后于计划呢?如果你不想看飞行中的电影,你通常可以切换你的视频屏幕,以显示一张地图,上面有你的飞机的位置。您还可以获得一些统计数据,例如预期到达时间(ETA),这很棒。

从终端窗口启动命令有时感觉就像没有视频屏幕的长途飞行。如果一切正常,或者流程是否已挂起,或者流程接近完成的程度,您都无法给出任何指示。闪烁的光标提供的信息不是很多。

pv和Progress命令为您提供一些统计数据和一些可视反馈。您可以看到这个过程离完成有多近了。这意味着您将获得正在运行的进程的ETA。与盯着光标相比,这轻而易举地赢得了胜利。

安装PV

您必须安装PV。

要在Ubuntu上安装PV,请使用以下命令:

sudo apt-get install pv

要在Fedora上安装PV,请使用以下命令:

sudo dnf install pv

要在Manjaro上安装PV,请使用以下命令:

sudo pacman -Syu pv

使用PV

PV代表管道查看器。管道必须在某个地方参与指挥。下面是一个示例,其中我们通过zip管道传输ISO图像,以生成ISO的压缩zip文件。

为了将命令减慢到可以截取屏幕截图的程度,本文使用的示例中的一些文件存储在名为SILVERXHD的旧的、速度较慢的外部USB上。

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso | zip > gparted.zip

我们可以在显示屏的底线看到PV给我们的信息。

从左到右,显示的信息为:

到目前为止传输的数据。 时间已经过去很久了。 数据传输速率(吞吐量)。 进度条和完成百分比数字。 完成前的估计剩余时间(ETA)。

使用PV复制文件

要使用PV的输出复制文件,请使用以下命令:

pv /media/dave/SILVERXHD/gparted-live-1.0.0-1-amd64.iso > gparted.iso

复制文件时,我们会收到进度报告。

使用PV复制多个文件

要使用PV复制多个文件和文件夹,我们需要使用一个小技巧。我们使用焦油来为我们移动文件。

tar -c help-files/ | pv | tar -x -C Documents/

命令的tar-c help-files/部分指示tar在help-files文件夹中创建(-c)文件的存档。然后,它被输送回tar文件,用于命令的最后一部分。在提取之前,存档被解压(-x),目录被更改为Documents(-C)。

因此,帮助文件中的文件和文件夹被复制到Documents文件夹,并显示进度。

这次的输出略有不同。

我们没有收到预计到达时间。进度条现在显示一个移动指示器。它显示进程处于活动状态,但不会像传统进度条那样从左向右增长。PV仅限于显示它可以从管道传输的进程中提取的信息。

使用PV和TAR创建归档文件

使用pv和tar复制文件不会给我们留下存档文件。TAR创建了一种“虚拟”存档,该存档直接反馈到TAR中以解压缩文件。如果我们的目标是复制文件,那就实现了。但是,如果我们想要创建存档文件,该怎么办呢?

我们仍然可以使用tar创建归档文件,并从PV获得进度报告。与tar一起使用的选项是-c(创建存档)、-z(使用gzip压缩)和-f(存档的文件名)。

注意,我们使用-作为文件名,这会导致tar使用标准输出,并将其输出写入终端窗口。我们看不到那个输出,因为它是通过光伏输送的。

存档的实际名称将是我们通过管道从pv输出到的文件名。在本例中,它是“help-files.tgz”。

tar -czf - ./help-files/ | pv > help-files.tgz

我们会得到与以前相同的进度指示器,并且会为我们创建存档文件。

相关:如何在Linux上使用tar命令压缩和解压缩文件

PV显示选项

有许多选项可以与pv一起使用来更改其报告的详细信息。

如果使用这些选项中的任何一个,则所有其他选项都将关闭。因此,如果希望使用其中三个显示选项,则需要指定这三个选项。

使用不带任何选项的pv与使用-pterb选项相同。

-p:显示完成百分比。这是进度条和完成百分比数字。 -t:显示运行时间。 -e:显示预计到达时间。 -r:显示数据传输速率。 -b:显示字节计数(到目前为止传输的数据)。 -n:将百分比显示为整数。这会将完成百分比打印为整数,并且每次新更新都会显示在新的一行上。

让我们重复最后一个命令,并将-p(完成百分比)选项传递给pv。

tar -czf - ./help-files/ | pv - p > help-files.tgz

这将关闭所有其他显示选项。PV仅提供完成百分比元素。

因为pv不能从tar获得完成百分比,所以进度条被替换为移动指示器。没有百分比数字。

将PV与WC配合使用

我们可以使用pv将一个(或多个)文本文件通过管道传输到wc。然后,WC将计算回车符、字符和单词,并且PV将给我们一个进度报告。

在这里,我们通过管道将Help-files目录中的所有“.page”文件传输到wc。

当WC完成时,我们可以从Help-files文件夹中的所有“.page”文件中看到回车(行)、字符和单词的计数。

安装进度命令

Progress命令提供与pv相同类型的有用信息,但它使用一组特定的Linux命令。

要在Ubuntu中安装进度,请使用以下命令:

sudo apt-get install progress

要在Fedora中安装进度,请使用以下命令:

sudo dnf install progress

要在Manjaro中安装进度,请使用以下命令:

sudo pacman -Syu progress

命令进度使用

在终端窗口中键入Progress并按Enter键将给您显示Progress使用的命令列表。

progress

对管道使用进度

我们可以使用两种技术来监视命令的进度。第一个是使用管道。

tar命令在Progress可以监视的受支持命令列表中,所以让我们使用tar。

我们将使用的选项是标准的-c(创建存档)、-z(使用gzip压缩)和-f(文件名)选项。我们将创建Help-files文件夹中所有内容的压缩存档,并将该存档命名为“help.tgz”。

我们通过管道将其传输到Progress中,并使用-m(Monitor)选项,因此Progress会一直报告该进程,直到它完成为止。

tar -czf help.tgz ./help-files/ | progress -m

终端窗口将在tar命令创建存档时显示该命令的进度。

在处理每个文件时,会列出该文件,其中包含以下信息:

进程ID。 进程名称。 已完成百分比。 处理的数据和文件的总大小。 数据速率(吞吐量)。 估计剩余时间(ETA)。

您可能会惊讶地看到出现第二个数据集。第一个数据集是针对TAR的。第二个是gzip。tar调用gzip来执行压缩。因为gzip在支持的命令列表中,所以会报告它的进度。

在连续监控模式下使用进度

您可以通过使用-M(监视器)选项在实时连续监视模式下使用进度。

在终端窗口中键入以下命令:

progress -M

Progress将报告没有命令正在运行以供其监视。但是您不会返回到命令行。Progress会等待,直到它可以监视的命令启动。然后,它将自动开始对其进行报告。

在另一个终端窗口中,键入进度可以监视的命令列表中的命令。

我们将使用CAT。过快结束的命令不会在进度中注册,因此我们将列出一个非常长的文本文件的内容。

cat words.page

在带有进度的终端窗口中,您将看到cat命令执行并接近完成时的统计信息。

当cat完成列出文件时,进度返回到其等待状态。

每当它可以报告的某个命令执行相当大的任务时,Progress都会自动监视并报告该任务。

那是相当整洁的。

100%完成

不要只是猜测一个长期运行的命令是如何运行的,而是从思考光标与PV和进度之间的关系中抽出一点时间来休息一下。

相关文章