如何从长 运行 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 与方法 SetProgressState
和 SetProgressValue
一起使用。
我打算编写一个 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 与方法 SetProgressState
和 SetProgressValue
一起使用。