Làm thế nào để kiểm tra tiến độ chạy cp?


54

Có thể kiểm tra tiến trình chạy quy trình cp không? Một số quy trình phản hồi các tín hiệu KILL khác nhau để bạn có thể kiểm tra trạng thái của chúng là gì. Tôi biết rằng tôi có thể chạy cp với tham số -v nhưng nếu quên làm điều đó, cp sẽ chạy trong một thời gian rất dài và tôi muốn biết tập tin nào đang được sao chép hoặc bao nhiêu đã được sao chép.


Hầu hết các giải pháp (trên Linux và có lẽ là POSIX khác, như Mac OS X) đều lạc hướng khi các thao tác đọc nhanh hơn nhiều so với thao tác ghi, hiển thị 100% trước khi hoàn thành thực tế. Lý do là các thao tác ghi nằm trong bộ đệm của hệ thống tập tin trước khi chúng thực sự được thực hiện. Tại thời điểm đó, mọi thứ rất khó để theo dõi. Thủ thuật này có thể làm giảm khoảng cách: trong một thiết bị đầu cuối khác while sleep 1 ; do sync ; done.
Stéphane Gourichon

Câu trả lời:


31

Có, bằng cách chạy stat trên tệp đích và tệp cục bộ và lấy kích thước tệp,

I E stat -c "%s" /bin/ls

Và bạn có được tỷ lệ phần trăm dữ liệu được sao chép bằng cách so sánh hai giá trị, đó là

Trong một triển khai rất cơ bản sẽ như thế này:

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
không có ý định đăng một bản sao đề xuất của bạn, vì vậy tôi đã thêm mã ở đây. Hy vọng bạn không phiền.
manatwork

@manatwork ah cảm ơn, tôi chỉ lười biếng trong việc đưa ra một ví dụ hoàn chỉnh :-)
daisy

Tuyệt vời, điều này sẽ có trong hộp công cụ của tôi trên tất cả các máy chủ! Cảm ơn!
ACK_stoverflow

trên linux 4, cp'ing từ một ổ USB nhanh sang micro sd giá rẻ trên đầu đọc thẻ cũ một tệp 500mb: cp và đồng bộ bị treo trong vài chục phút. nhưng nếu tôi thống kê tệp nguồn và tệp đích, tôi sẽ nhận được cùng một số chính xác trên cả 10 giây sau khi cp bắt đầu.
gcb

40

Trên các phiên bản gần đây của Mac OS X, bạn chỉ cần nhấn CTRL+ Tđể xem tiến trình. Từ trang man OSX 10.6 cho 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."

Đánh CTRL+ Ttương đương với báo hiệu quá trình hiện tại với SIGINFO trên các máy BSD-ish, bao gồm cả OSX.

Điều này làm việc cho dd (1) là tốt.

Tôi không nghĩ Linux có cơ chế SIGINFO này và không thấy bất cứ điều gì trong trang man GNU cho cp (1) về các tín hiệu có thể được sử dụng để báo cáo tiến trình.


1
Ồ Nó không cung cấp cho tôi nhiều thông tin, nhưng đủ để biết tôi mvcòn sống. Cảm ơn!
Dan Rosenstark

Nó chỉ cho bạn biết phần trăm hoàn thành cho từng tệp mà nó đang sao chép khi nhận được tín hiệu. Nó không cho phần trăm hoàn thành toàn bộ công việc mà nó đang làm.
Joe C

21

Khi bạn sao chép nhiều tệp du -s /path/to/destinationhoặc find /path/to/destination | wc -lcung cấp cho bạn ý tưởng về số lượng đã được thực hiện.

Bạn có thể tìm ra tập tin nào đang được sao chép với lsof -p12341234 là ID tiến trình của cp. Trong nhiều hệ thống, pgrep -x cpbáo cáo ID quy trình của tất cả các quy trình đang chạy có tên cp. Điều này có thể không hữu ích lắm vì thứ tự các tệp trong một thư mục đã cho được sao chép về cơ bản là không thể đoán trước được (trong một thư mục lớn trong Linux, ls --sort=nonesẽ cho bạn biết; với cây thư mục, hãy thử find).

lsof -p1234cũng cho bạn biết có bao nhiêu byte cpđã đọc và ghi cho tệp hiện tại, trong OFFSETcột.

Trong Linux, có số liệu thống kê sử dụng IO trong /proc/$pid/io(một lần nữa, sử dụng PID của cpquy trình cho $pidf). Các rchargiá trị là tổng số byte rằng quá trình này đã đọc, và wcharlà số byte rằng quá trình này đã viết. Điều này bao gồm không chỉ dữ liệu trong tệp mà còn siêu dữ liệu trong thư mục. Bạn có thể so sánh con số đó với con số gần đúng thu được du /path/to/source(chỉ tính dữ liệu tệp). read_byteswrite_byteschỉ bao gồm những gì đã được đọc hoặc ghi từ bộ lưu trữ, tức là nó loại trừ chẩn đoán cuối cùng và dữ liệu đã có trong bộ đệm hoặc vẫn còn trong bộ đệm.


4
cho thời gian thực:watch lsof -p1234
mchid

3
Hoặc tất cả trong một lần:watch lsof -p`pgrep -x cp`
Mike

15

Một công cụ tương đối mới thực hiện chính xác đó là tiến trình (trước đây là cv [trình xem coreutils]).

Nó là gì?

Công cụ này có thể được mô tả như một lệnh Tiny, Dirty, Linux và OSX-Only C tìm kiếm các lệnh cơ bản của coreutils (cp, mv, dd, tar, gzip / gunzip, cat, v.v.) hiện đang chạy trên hệ thống của bạn và hiển thị phần trăm dữ liệu được sao chép.

Làm thế nào nó hoạt động?

Nó chỉ đơn giản là quét /proccác lệnh thú vị, sau đó xem các thư mục fdfdinfotìm các tệp đã mở và tìm kiếm các vị trí cũng như báo cáo trạng thái cho tệp lớn nhất.


5
Việc sử dụng này hiện được gọi là tiến trình: github.com/Xfennec/proceed
Taavi Ilves

14

Một trong những thủ thuật yêu thích của tôi cho việc này (trong Linux) là tìm ra PID của cpquá trình (sử dụng ps | grep cphoặc tương tự), sau đó tìm trong /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

Điều này sẽ cho bạn thấy những gì các quá trình đã mở. Nếu bạn muốn xem bao xa trong tập tin thì quá trình là ...

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

các postham số là vị trí của đọc (hoặc viết) con trỏ, tính bằng byte.


7

Có một vài điều bạn có thể làm. Bạn có thể đính kèm stracevới nó để xem những gì nó đang làm (đầu ra có thể rất nhiều!):

strace -p [pid của cp]

hoặc bạn có thể nhận lsofcho bạn biết tập tin nào hiện đang mở:

lsof -p [pid của cp]

Nếu bạn đang chạy một đệ quy lớn cp, bạn có thể sử dụng pwdxđể có được thư mục làm việc hiện tại, điều này có thể cho bạn một số ý tưởng về cách thức hoạt động của nó:

pwdx [pid của cp]

4

Mặc dù OP đã đề cập cụ thể đến khả năng xem lệnh "cp" đang tiến triển như thế nào, phải nói rằng các tiện ích khác tốt hơn cho vấn đề cụ thể này.

Ví dụ:

rsync -avP FROM TO

sẽ hiển thị tiến trình sao chép tệp TỪ / thư mục vào tệp TO / FOLDER.


# 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

Và rsync sẽ cho bạn biết số tiền được sao chép (và tốc độ truyền) trên đường đi. Nó hoạt động cho các tệp hoặc thư mục duy nhất trên cùng một máy hoặc trên toàn mạng.


2
Bạn đang trả lời sai câu hỏi. Câu hỏi mà bạn đang tìm kiếm là: unix.stackexchange.com/questions/2577/ , đã có câu trả lời đề cập rsync.
muru

1

Những gì bạn có thể làm là kiểm tra các tập tin tại đích.

Nếu các lệnh cp của bạn giống như cp -a <my_source> <my_dest_folder>tôi sẽ kiểm tra tệp nào đã được sao chép <my_dest_folder>và từng kích thước tệp, vì vậy tôi có thể xem tiến trình. Nếu <my_source>một chút phức tạp (một vài lớp thư mục) thì một tập lệnh nhỏ sẽ có thể kiểm tra trạng thái. Mặc dù tập lệnh như vậy có thể tiêu tốn một chút I / O mà sau đó cpquy trình sẽ không được sử dụng .


1

Công cụ này là một lệnh tiện ích Linux tìm kiếm các lệnh cơ bản của coreutils (cp, mv, dd, tar, gzip / gunzip, cat, v.v.) hiện đang chạy trên hệ thống của bạn và hiển thị phần trăm dữ liệu được sao chép:

https://github.com/Xfennec/cv


1

Tôi muốn thêm cpv, một trình bao bọc nhỏ pvmà tôi đã viết bắt chước cách sử dụng cp.

Đơn giản và hữu ích

nhập mô tả hình ảnh ở đây

Bạn có thể lấy nó ở đây



0

Sử dụng pv -d:

-d PID[:FD], --watchfd PID[:FD]
Thay vì truyền dữ liệu, hãy xem mô tả tệp FDcủa quá trình PIDvà hiển thị tiến trình của nó. [V]] Nếu chỉ có một PIDchỉ định, thì quá trình đó sẽ được xem và tất cả các tệp và thiết bị chặn thông thường mà nó mở sẽ được hiển thị với một thanh tiến trình. Các pvquá trình sẽ thoát ra khi quá trình PIDthoát.

( nguồn )

Tìm hiểu về PID của bạn đang chạy cp( pidof cp), giả sử đó là 12345; sau đó đơn giản

pv -d 12345

Ghi chú:

  • Chạy pvnhư cùng một người dùng chạy cp(hoặc là root).
  • Vì sao chép có nghĩa là đọc một tệp và ghi vào tệp kia, dự kiến ​​sẽ thấy hai tệp được theo dõi cùng một lúc.
  • Nếu cphiện đang xử lý các tệp nhỏ, có thể bạn sẽ không thấy tất cả chúng trong đầu ra (một tệp nhỏ có thể bị đóng quá nhanh pvđể lấy nó). Tuy nhiên, một số sẽ xuất hiện, vì vậy thậm chí sau đó bạn sẽ có thể nói những gì cplàm.
  • pv -d "$(pidof cp)"có thể làm việc; nhưng nếu có nhiều hơn một lần cpchạy, nó sẽ không hoạt động. Có pidof -strả về nhiều nhất một PID, nhưng bạn không thể chắc chắn nó sẽ thuộc đúng cpquy trình nếu có nhiều.

-1

Bạn có thể gửi tín hiệu cho quá trình:

kill -SIGUSR1 pid

Thậm chí còn hữu ích hơn khi tạo một tập lệnh thăm dò ý kiến ​​cho đến khi bạn nhấn Ctrl-C hoặc quá trình kết thúc:

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

Hoạt động cho dd. Không hoạt động cho cp . Có lẽ bạn phải sử dụng tín hiệu khác. Tôi đã từng thử SIGINFO, nhưng dường như nó không còn tồn tại trên nền tảng Intel nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.