如何从长 运行 linux 命令发送进程进度信息

How to send process progress information from a long running linux command

我打算编写一个 linux 命令来处理(使用自定义逻辑)一个非常大的文件。一旦这个命令是运行,完成任务需要几个小时。

提供 eta 输出的最佳方式是什么?

写一个 100 字节的进度状态文件的想法怎么样?在特定阶段,我可以将字节写入文件。假设在 40% 时我可以向文件写入 40 个字节。一旦文件大小达到 100 字节大小,则表示该过程已完成。因此,要监控进度,我们只需检查此文件的大小。

是否有任何通用的方法来处理此类进度信息?我不想在我的程序中包含太多用于显示进度信息的逻辑。我正在寻找一个简单的解决方案。

有什么建议吗?

正常 方法是像 dd 那样设置一个信号处理程序,然后使用 kill 命令,它捕获信号并输出​​状态消息。尝试

man dd

所以,例如,在我的 iMac 上,dd 使用 SIGINFO,所以

# Move a whole load of nothing to nowhere in the background
dd if=/dev/zero of=/dev/null &
[1] 11232

# No output, till I want some a few seconds later

kill -SIGINFO 11232
12875835+0 records in
12875834+0 records out
6592427520 bytes transferred in 9.380158 secs (702805581 bytes/sec)



# No more output, till I want some a few more seconds later

kill -SIGINFO 11232
19163866+0 records in
19163865+0 records out
9811898880 bytes transferred in 14.015095 secs (700095068 bytes/sec)

信号处理程序非常容易设置,即使在 shell 脚本中也是如此。例如:

#!/bin/bash

trap "echo Progress report..." SIGINT
echo "My process id is $$"

while : ; do
    sleep 10    # Do something - admittedly little :-)
done

恐怕你不能在 Linux 中很好地做到这一点,但如果你的程序的结果可以是像解压缩中那样的输出流,那么你可以使用 pv - Pipe Viewer 命令。您可以将输出重定向到 pv 输入,它会显示进度。

在 Windows 中,您可以将 Taskbar Extensions API 与方法 SetProgressStateSetProgressValue 一起使用。