是否可以检查运行 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 -p1234
cp
还告诉您当前文件在该列中已经读取和写入了多少字节OFFSET
。
在Linux下,有IO使用统计(同样,使用进程/proc/$pid/io
的PID )。该值是进程已读取的总字节数,也是进程已写入的字节数。这不仅包括文件中的数据,还包括目录中的元数据。您可以将该数字与通过(仅计算文件数据) 获得的近似数字进行比较。并且仅包括已从存储中读取或写入的内容,即,它排除终端诊断和已经在高速缓存中或仍在缓冲区中的数据。cp
$pidf
rchar
wchar
du /path/to/source
read_bytes
write_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
是读(或写)指针的位置,以字节为单位。