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

时间:2015-04-09 05:59:08

标签: linux process progress

我打算编写一个linux命令,它将处理(使用自定义逻辑)一个非常大的文件。运行此命令后,完成任务将花费数小时。

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

编写100字节进度状态文件的想法怎么样?在特定的阶段,我可以写入文件的字节。比如40%我可以写40个字节到文件。一旦文件大小达到100字节大小,就意味着该过程结束。因此,要监控进度,我们只需检查此文件的大小。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

正常的方式是设置像dd这样的信号处理程序,然后使用kill命令向进程发送SIGUSR1或者某些东西信号并输出​​状态信息。尝试

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

答案 1 :(得分:0)

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

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