如何查看cp的运行进度?


54

是否可以检查cp进程的运行进度?某些进程会响应各种KILL信号,以便您可以检查它们的状态。我知道我可以使用参数-v运行cp,但是如果忘记这样做,cp运行了很长时间,我想知道要复制哪个文件,或者已经复制了多少文件。


当读取操作比写入操作快得多时,大多数解决方案(在Linux以及可能的其他POSIX,例如Mac OS X上)都会偏离轨道,在实际完成之前显示100%。原因是写操作在实际执行之前就位于文件系统缓存中。那时,事情很难追踪。这个技巧可以缩小差距:在另一个终端while sleep 1 ; do sync ; done
斯特凡纳·古里科

Answers:


31

是的,通过对目标文件和本地文件运行stat并获取文件大小,

stat -c "%s" /bin/ls

通过比较这两个值,您可以获得复制数据的百分比,仅此而已

在一个非常基本的实现中,它将如下所示:

function cpstat()
{
  local pid="${1:-$(pgrep -xn cp)}" src dst
  [[ "$pid" ]] || return
  while [[ -f "/proc/$pid/fd/3" ]]; do
    read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
    (( src )) || break
    printf 'cp %d%%\r' $((dst*100/src))
    sleep 1
  done
  echo
}

4
不想发布您的建议的重复内容,因此我在此处添加了代码。希望你不要介意。
manatwork 2013年

@manatwork啊,谢谢,我只是在举一个完整的例子而懒惰:-)
雏菊

太好了,这将在所有服务器上的我的工具箱中进行!谢谢!
ACK_stoverflow

在linux 4上,cp从一个快速的USB驱动器到一个旧读卡器上的便宜的micro sd,一个500mb的文件:cp和sync挂起了几十分钟。但是,如果我统计了源文件和目标文件,则在cp启动后的10s都得到了完全相同的数字。
gcb

40

在最新版本的Mac OS X中,您只需按CTRL+ T即可查看进度。在OSX 10.6的cp(1)手册页中

 "If cp receives a SIGINFO (see the status argument for stty(1)) signal,
 the current input and output file and the percentage complete will be
 written to the standard output."

点击CTRL+ T等同于在BSD-ish机器(包括OSX)上使用SIGINFO指示当前进程。

这也适用于dd(1)

我不认为Linux具有这种SIGINFO机制,并且在cp(1)GNU手册页中看不到任何有关可用于报告进度的信号的信息。


1
哇!它不会给我太多信息,但是足以知道我mv还活着。谢谢!
Dan Rosenstark '16

它仅告诉您接收到信号时正在复制的单个文件的完成百分比。它没有给出正在执行的整个工作的完成百分比。
Joe C

21

当您要复制很多文件时,du -s /path/to/destination或者find /path/to/destination | wc -l让您知道已经完成了多少工作。

您可以找到正在复制哪个文件,lsof -p1234其中1234是的进程ID cp。在许多系统下,pgrep -x cp报告名为的所有正在运行的进程的进程ID cp。这可能不是很有用,因为给定目录内文件的复制顺序本质上是不可预测的(在Linux下的大目录中,ls --sort=none将告诉您;使用目录树,请尝试find)。

lsof -p1234还会cp在此OFFSET列中告诉您当前文件已读写了多少字节。

在Linux下,其中包含IO使用情况统计信息/proc/$pid/io(同样,将的cp进程PID 用于$pidf)。该rchar值是进程已读取的总字节数,并且wchar是进程已写入的字节数。这不仅包括文件中的数据,还包括目录中的元数据。您可以将该图与通过所获得的近似图进行比较du /path/to/source(仅计算文件数据)。 read_bytes并且write_bytes仅包括已从存储读取或写入的内容,即,它不包括终端诊断和已经在缓存中或仍在缓冲区中的数据。


4
实时:watch lsof -p1234
mchid

3
watch lsof -p`pgrep -x cp`
Mike

15

一个相对较新的工具,正是这么做的进步(原CV [coreutils的浏览器])。

它是什么?

该工具可以描述为Tiny,Dirty,仅Linux和OSX的C命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等)。显示复制数据的百分比。

它是如何工作的?

它仅扫描/proc感兴趣的命令,然后查看目录fdfdinfo查找打开的文件并查找位置,并报告最大文件的状态。



14

我最喜欢的技巧(在Linux下)之一是找出cp进程的PID (使用ps | grep cp或类似方法),然后查找/proc/$PID/fd//proc/$PID/fdinfo/

$ cp -r y z
^Z
$ ls -l /proc/8614/fd
lrwx------ 1 jander jander 64 Aug  2 15:21 0 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:21 1 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:20 2 -> /dev/pts/4
lr-x------ 1 jander jander 64 Aug  2 15:21 3 -> /home/jander/y/foo.tgz
l-wx------ 1 jander jander 64 Aug  2 15:21 4 -> /home/jander/z/foo.tgz

这将向您显示该进程打开了哪些文件。如果您想查看文件距离文件有多远...

$ cat /proc/8614/fdinfo/3
pos:    105381888
flags:  0500000

pos参数是读(或写)指针的位置,以字节为单位。


7

您可以做几件事。您可以附加strace它以查看其作用(输出可能很多!):

strace -p [cp的pid]

或者您可以lsof告诉您当前打开了哪些文件:

lsof -p [cp的pid]

如果您正在运行大型递归cp,则可以pwdx用来获取当前的工作目录,这可能使您对它的工作方式有所了解:

pwdx [cp的pid]

4

尽管OP特别提到了查看“ cp”命令进行情况的能力,但必须指出,其他实用程序对于此特定问题更好。

例如:

rsync -avP FROM TO

将显示将FROM文件/文件夹复制到TO文件/文件夹的进度。


# rsync -avP Video.mp4  /run/media/user1/3.8G/

sending incremental file list
Video.mp4
    565,170,046 100%   51.23MB/s    0:00:10 (xfr#1, to-chk=0/1)

sent 565,308,115 bytes  received 134 bytes  5,210,214.28 bytes/sec
total size is 565,170,046  speedup is 1.00

rsync会告诉您复制过程中复制了多少(以及传输速率)。它适用于同一台计算机或网络上的单个文件或文件夹。


2
您在回答错误的问题。您正在寻找的问题是:unix.stackexchange.com/questions/2577/…,其中已经提到了答案rsync
muru 2015年

1

您可以做的是在目标位置检查文件。

如果您的cp命令类似,cp -a <my_source> <my_dest_folder>我会检查已经复制了哪些文件<my_dest_folder>以及每个文件的大小,以便可以看到进度。如果<my_source>有点复杂(几层目录),那么一个小的脚本就能检查状态。尽管这样的脚本可能会消耗一些I / O,但该I / O不会被cp进程使用。


1

该工具是Linux实用程序命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等),并显示复制数据的百分比:

https://github.com/Xfennec/cv


1

我想补充cpv一点,为pv我写的一个小包装程序,它模仿的用法cp

简单实用

在此处输入图片说明

你可以在这里得到



0

用途pv -d

-d PID[:FD], --watchfd PID[:FD]
不用传输数据,而是查看FDprocess的文件描述符PID并显示其进度。[…]如果仅PID指定a,则将监视该过程,并且打开的所有常规文件和块设备将显示进度条。当pv进程退出时,该进程将PID退出。

来源

找出正在运行的PID cppidof cp),假设它是12345;然后简单地

pv -d 12345

笔记:

  • pv以与运行相同的用户身份运行cp(或以root 用户身份)。
  • 由于复制意味着读取一个文件并写入另一个文件,因此希望一次查看两个文件。
  • 如果当前cp正在处理小文件,您可能不会在输出中看到所有文件(小文件可能关闭得太快而pv无法拾取)。但是还会出现一些,所以即使那样您仍然可以分辨出是什么cp
  • pv -d "$(pidof cp)"可以工作;但是如果cp运行的次数不止一次,则将无法正常运行。有pidof -s这至多一个PID返回,但不能肯定这将属于正确的cp过程中如果有很多。

-1

您可以向过程发送信号:

kill -SIGUSR1 pid

创建一个轮询脚本,直到您按Ctrl-C或该过程完成之前,它甚至更有用:

while [ : ] ; do kill -SIGUSR1 $1 && sleep 1m || exit ; done

适用于dd。不适用于cp。也许您必须使用另一个信号。我曾经尝试过SIGINFO,但在Intel平台上似乎不再存在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.