如何查看cp运行进度?

如何查看cp运行进度?

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

答案1

在最新版本的 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."

在 BSD 风格的机器(包括 OSX)上,点击CTRL+T相当于用 SIGINFO 发送当前进程的信号。

这适用于日(1)以及。

我不认为 Linux 有这个 SIGINFO 机制,并且在cp(1) 的 GNU 手册页关于可用于报告进度的信号。

答案2

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

IEstat -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
}

答案3

当您复制大量文件时,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 -p1234cp还告诉您当前文件在该列中已经读取和写入了多少字节OFFSET

在Linux下,有IO使用统计(同样,使用进程/proc/$pid/io的PID )。该值是进程已读取的总字节数,也是进程已写入的字节数。这不仅包括文件中的数据,还包括目录中的元数据。您可以将该数字与通过(仅计算文件数据) 获得的近似数字进行比较。并且仅包括已从存储中读取或写入的内容,即,它排除终端诊断和已经在高速缓存中或仍在缓冲区中的数据。cp$pidfrcharwchardu /path/to/sourceread_byteswrite_bytes

答案4

我最喜欢的技巧之一(在 Linux 下)是找出进程的 PID cp(使用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是读(或写)指针的位置,以字节为单位。

相关内容