📝 碎碎念 (Intro)
今天在折腾家里的 HomeLab 服务器时,犯了一个经典的“低级错误”。
我想把一个 50GB 的大压缩包(下载的一千多首音乐)从一个系统机械硬盘迁移到挂载的机械硬盘里。顺手就在终端敲了一个 mv data.zip /mnt/hdd/。
回车键按下去的一瞬间,我就后悔了。
终端光标开始在那儿无辜地闪烁,没有任何输出。我知道,接下来的十几分钟(甚至更久,取决于那块 SMR 盘的心情),我将处于完全的“盲盒”状态。我看不到进度,不知道速度是跑满了还是掉速了,甚至不知道 SSH 链接是不是还活着。
这时候我面临两个选择:
Ctrl+C杀掉进程,清理残文件,然后换rsync -P重来。(风险太大,怕文件损坏)傻等。(强迫症极其难受)
就在我盯着 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 文件系统:
扫描进程:它遍历
/proc下的所有数字目录(PID),寻找特定的进程名(如mv,cp)。查找文件描述符 (FD):它读取
/proc/[pid]/fd/,找到该进程正在打开并操作的文件。获取位置:它读取
/proc/[pid]/fdinfo/[fd],这里面记录了当前的文件偏移量(pos)。计算:用
pos除以文件总大小,就得到了进度。
正因为它是基于文件系统的“旁路读取”,所以它对原进程几乎没有性能影响,非常安全。
📝 总结
下次如果你在服务器上顺手敲了 cp 或 mv 处理几十 G 的数据,然后对着闪烁的光标陷入焦虑时,别忘了敲入 progress -M。
它不仅能治愈你的“等待焦虑症”,还能帮你判断磁盘是不是掉速了(比如那坑爹的 SMR 叠瓦盘爆缓存)。
一句话总结:pv 是给有准备的人用的,而 progress 是给像我这样手快的人用的“后悔药”