yanchang
yanchang
发布于 2026-02-06 / 11 阅读
0
0

Linux 下的神奇小工具 Progress,给运行中的 cp/mv 加上进度条

📝 碎碎念 (Intro)

今天在折腾家里的 HomeLab 服务器时,犯了一个经典的“低级错误”。

我想把一个 50GB 的大压缩包(下载的一千多首音乐)从一个系统机械硬盘迁移到挂载的机械硬盘里。顺手就在终端敲了一个 mv data.zip /mnt/hdd/

回车键按下去的一瞬间,我就后悔了。

终端光标开始在那儿无辜地闪烁,没有任何输出。我知道,接下来的十几分钟(甚至更久,取决于那块 SMR 盘的心情),我将处于完全的“盲盒”状态。我看不到进度,不知道速度是跑满了还是掉速了,甚至不知道 SSH 链接是不是还活着。

这时候我面临两个选择:

  1. Ctrl+C 杀掉进程,清理残文件,然后换 rsync -P 重来。(风险太大,怕文件损坏)

  2. 傻等。(强迫症极其难受)

就在我盯着 top 里的 iowait 发呆时,我发现了一个相见恨晚的神器 —— Progress。它不需要你提前用管道符(如 pv),它能直接“监听”已经在运行的进程,凭空给它们变出一个进度条来。

简直是运维救星,必须记录一下。


🛠️ 什么是 Progress?

progress(以前叫 cv - Coreutils Viewer)是一个 Linux 工具,它用来查找那些正在执行核心命令(如 cp, mv, dd, tar, gzip/gunzip, cat, etc.)的进程。

它的黑魔法在于: 它不需要你重新运行命令。哪怕你的 mv 已经跑了 10 分钟了,你在另一个窗口运行 progress,它依然能准确地告诉你:现在跑到百分之几了,还需要几分钟跑完。

📦 安装

在大多数主流发行版里,它都在官方仓库中:

Debian / Ubuntu / Kali:

Bash

sudo apt install progress

CentOS / RHEL / Fedora:

Bash

sudo yum install progress
# 或者
sudo dnf install progress

Arch Linux:

Bash

sudo pacman -S progress

macOS (Homebrew):

Bash

brew install progress

🚀 核心用法

1. 查岗模式(最基础)

如果你只想看一眼当前有没有命令在偷跑流量,或者看一眼刚才那个 mv 到哪了,直接输入:

Bash

sudo progress

它会输出类似这样的快照:

Plaintext

[ 25841] mv /home/user/bigfile.zip
        23.4% (11.7 GiB / 50 GiB)

2. 监控模式(最推荐)

如果不加参数,它只显示一瞬间的状态。加上 -M (Monitor) 参数,它就会像 top 一样持续刷新,变成一个实时的仪表盘:

Bash

sudo progress -M

这时候你会看到极度舒适的画面,包含了百分比当前吞吐速度预估剩余时间 (ETA)

Plaintext

[ 25841] mv /home/user/bigfile.zip
        42.1% (21.0 GiB / 50 GiB) 105.2 MiB/s  0:04:42 remaining

3. 监控解压进度

正如我遇到的场景,除了移动文件,解压大文件也是“盲盒”重灾区。progress 完美支持 unzip, tar, gzip 等命令:

Bash

# 当你在后台运行了 unzip bigfile.zip 后
sudo progress -M

它能自动识别出 unzip 正在读取 bigfile.zip,并根据读取量计算解压进度。


🧐 它是怎么做到的?(原理篇)

作为 CS 学生,当然要探究一下它是怎么实现的。难道它注入了进程内存?

其实原理非常优雅且简单,它利用了 Linux 的 /proc 文件系统:

  1. 扫描进程:它遍历 /proc 下的所有数字目录(PID),寻找特定的进程名(如 mv, cp)。

  2. 查找文件描述符 (FD):它读取 /proc/[pid]/fd/,找到该进程正在打开并操作的文件。

  3. 获取位置:它读取 /proc/[pid]/fdinfo/[fd],这里面记录了当前的文件偏移量(pos)。

  4. 计算:用 pos 除以文件总大小,就得到了进度。

正因为它是基于文件系统的“旁路读取”,所以它对原进程几乎没有性能影响,非常安全。

📝 总结

下次如果你在服务器上顺手敲了 cpmv 处理几十 G 的数据,然后对着闪烁的光标陷入焦虑时,别忘了敲入 progress -M

它不仅能治愈你的“等待焦虑症”,还能帮你判断磁盘是不是掉速了(比如那坑爹的 SMR 叠瓦盘爆缓存)。

一句话总结:pv 是给有准备的人用的,而 progress 是给像我这样手快的人用的“后悔药”


评论