จะตรวจสอบความคืบหน้าของการรัน cp ได้อย่างไร?


54

เป็นไปได้หรือไม่ที่จะตรวจสอบความคืบหน้าของการรันกระบวนการ cp? กระบวนการบางอย่างตอบสนองต่อสัญญาณ KILL ต่างๆเพื่อให้คุณสามารถตรวจสอบสถานะของพวกเขาได้ ฉันรู้ว่าฉันสามารถเรียกใช้ cp ด้วยพารามิเตอร์ -v แต่ถ้าลืมที่จะทำเช่นนั้น cp กำลังทำงานอยู่เป็นเวลานานมากและฉันต้องการที่จะรู้ว่าไฟล์ใดที่จะถูกคัดลอกหรือจำนวนที่ถูกคัดลอกแล้ว


โซลูชันส่วนใหญ่ (บน Linux และ POSIX อื่น ๆ เช่น Mac OS X) หลุดพ้นเมื่อการดำเนินการอ่านเร็วกว่าการเขียนมากแสดงถึง 100% ก่อนการเสร็จสิ้นจริง เหตุผลคือการดำเนินการเขียนอยู่ในแคชของระบบไฟล์ก่อนที่จะดำเนินการจริง ณ จุดนี้สิ่งที่ยากต่อการติดตาม เคล็ดลับนี้อาจจะลดช่องว่าง: ใน while sleep 1 ; do sync ; doneterminal
Stéphane Gourichon

คำตอบ:


31

ใช่โดยการเรียกใช้สถิติกับไฟล์เป้าหมายและไฟล์ในเครื่องและรับขนาดไฟล์

กล่าวคือ 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
ไม่ได้ตั้งใจโพสต์คำแนะนำของคุณซ้ำดังนั้นฉันจึงเพิ่มรหัสที่นี่ หวังว่าคุณจะไม่รังเกียจ
จัดการ

@ การจัดทำอ่าขอบคุณฉันแค่ขี้เกียจที่จะให้ตัวอย่างที่สมบูรณ์ :-)
daisy

ยอดเยี่ยมนี่คือกล่องเครื่องมือของฉันบนเซิร์ฟเวอร์ทั้งหมด! ขอบคุณ!
ACK_stoverflow

บน linux 4, cp'ing จากไดรฟ์ usb ที่รวดเร็วไปยัง micro sd ราคาถูกบนเครื่องอ่านการ์ดเก่าไฟล์ 500mb: cp และ sync แขวนค้างนานหลายสิบนาที แต่ถ้าฉันสร้างไฟล์ต้นทางและไฟล์ปลายทางฉันจะได้หมายเลขเดียวกันทั้ง 10 วินาทีหลังจาก cp เริ่ม
gcb

40

ใน Mac OS X รุ่นล่าสุดคุณสามารถกดCTRL+ Tเพื่อดูความคืบหน้า จากหน้า man 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."

Hitting CTRL+ Tเทียบเท่ากับการส่งสัญญาณกระบวนการปัจจุบันด้วย SIGINFO บนเครื่อง BSD-ish รวมถึง OSX

ใช้ได้กับdd (1)เช่นกัน

ฉันไม่คิดว่า Linux มีกลไก SIGINFO นี้และไม่เห็นอะไรในGNU man page สำหรับ cp (1)เกี่ยวกับสัญญาณที่สามารถใช้เพื่อรายงานความคืบหน้า


1
ว้าว! มันไม่ได้ให้ข้อมูลมากนัก แต่ก็เพียงพอที่จะรู้ว่าฉันmvมีชีวิตอยู่ ขอบคุณ!
Dan Rosenstark

โดยจะบอกให้คุณทราบถึงเปอร์เซ็นต์ที่สมบูรณ์สำหรับแต่ละไฟล์ว่ามีการคัดลอกเมื่อได้รับสัญญาณ มันไม่ได้ให้เปอร์เซ็นต์ที่สมบูรณ์ของงานทั้งหมดที่กำลังทำอยู่
Joe C

21

เมื่อคุณคัดลอกไฟล์จำนวนมากdu -s /path/to/destinationหรือfind /path/to/destination | wc -lให้แนวคิดเกี่ยวกับจำนวนที่ทำไปแล้ว

คุณสามารถหาที่ไฟล์จะถูกคัดลอกด้วยlsof -p1234ที่ 1234 กระบวนการ ID cpของ ภายใต้ระบบหลายรายงานรหัสกระบวนการของกระบวนการทำงานทั้งหมดชื่อpgrep -x cp 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
ตามเวลาจริง:watch lsof -p1234
mchid

3
หรือทั้งหมดในครั้งเดียว:watch lsof -p`pgrep -x cp`
ไมค์

15

เครื่องมือที่ค่อนข้างใหม่ซึ่งทำหน้าที่เป็นความคืบหน้าอย่างแน่นอน(ก่อนหน้านี้คือ cv [coreutils viewer])

มันคืออะไร?

เครื่องมือนี้สามารถอธิบายได้ว่าเป็นคำสั่ง C ขนาดเล็ก, สกปรก, Linux และ OSX เท่านั้นที่ค้นหาคำสั่ง coreutils พื้นฐาน (cp, mv, dd, tar, gzip / gunzip, cat ฯลฯ ) ที่ทำงานอยู่ในระบบของคุณในปัจจุบันและ แสดงเปอร์เซ็นต์ของข้อมูลที่คัดลอก

มันทำงานยังไง?

มันแค่สแกน/procหาคำสั่งที่น่าสนใจแล้วมองไปที่ไดเรกทอรีfdและfdinfoค้นหาไฟล์ที่เปิดอยู่และค้นหาตำแหน่งและรายงานสถานะของไฟล์ที่ใหญ่ที่สุด


5
การใช้ประโยชน์นี้เรียกว่าความคืบหน้า: github.com/Xfennec/progress
Taavi Ilves

14

หนึ่งในเทคนิคที่ชื่นชอบสำหรับนี้ (ภายใต้ 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พารามิเตอร์เป็นตำแหน่งของการอ่าน (หรือเขียน) ตัวชี้ไบต์


7

มีบางสิ่งที่คุณสามารถทำได้ คุณสามารถแนบstraceไปกับมันเพื่อดูว่ามันกำลังทำอะไรอยู่ (ผลลัพธ์อาจจะมากมาย!):

strace -p [pid of cp]

หรือคุณสามารถlsofบอกได้ว่าไฟล์ใดที่เปิดอยู่ในปัจจุบัน:

lsof -p [pid of cp]

หากคุณเรียกใช้ recursive ครั้งใหญ่cpคุณสามารถใช้pwdxเพื่อรับไดเรกทอรีงานปัจจุบันซึ่งอาจทำให้คุณมีความคิดในการทำงาน:

pwdx [pid of cp]

4

ในขณะที่ OP ได้กล่าวถึงความสามารถในการดูว่าคำสั่ง "cp" นั้นดำเนินไปอย่างไรนั้นต้องกล่าวว่ายูทิลิตี้อื่น ๆ นั้นดีกว่าสำหรับปัญหาเฉพาะนี้

ตัวอย่างเช่น:

rsync -avP 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

1

สิ่งที่คุณสามารถทำได้คือตรวจสอบไฟล์ที่ปลายทาง

หากคำสั่ง cp ของคุณเหมือนกับที่cp -a <my_source> <my_dest_folder>ฉันจะตรวจสอบว่าไฟล์ใดถูกคัดลอกไปแล้ว<my_dest_folder>และขนาดไฟล์แต่ละไฟล์ ถ้า<my_source>เป็นบิตซับซ้อน (หลายชั้นของไดเรกทอรี) จากนั้นสคริปต์ขนาดเล็กจะสามารถตรวจสอบสถานะ แม้ว่าสคริปต์ดังกล่าวอาจใช้ I / O เล็กน้อยซึ่งจะไม่ถูกใช้โดยcpกระบวนการ


1

เครื่องมือนี้เป็นคำสั่งยูทิลิตี Linux ที่มองหาคำสั่งพื้นฐานของ coreutils (cp, mv, dd, tar, gzip / gunzip, cat ฯลฯ ) ที่ทำงานอยู่ในระบบของคุณในปัจจุบันและแสดงเปอร์เซ็นต์ของข้อมูลที่คัดลอก:

https://github.com/Xfennec/cv


1

ฉันต้องการที่จะเพิ่มcpv, กระดาษห่อเล็ก ๆ น้อย ๆที่ผมเขียนที่เลียนแบบการใช้งานของpvcp

ง่ายและมีประโยชน์

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถรับได้ที่นี่



0

การใช้pv -d:

-d PID[:FD], --watchfd PID[:FD]
แทนที่จะถ่ายโอนข้อมูลให้ดูตัวอธิบายไฟล์FDของกระบวนการPIDและแสดงความคืบหน้า […] หากPIDระบุเพียง a กระบวนการนั้นจะถูกเฝ้าดูและไฟล์ปกติและอุปกรณ์บล็อกทั้งหมดที่เปิดขึ้นมาจะปรากฏขึ้นพร้อมแถบความคืบหน้า pvกระบวนการจะออกเมื่อกระบวนการPIDออก

(ที่มา )

ค้นหา PID ของการวิ่งของคุณcp( pidof 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

ทำงานได้สำหรับวว ไม่ทำงานสำหรับซีพี บางทีคุณต้องใช้สัญญาณอื่น ฉันเคยลอง SIGINFO แต่ดูเหมือนว่ามันจะไม่มีอยู่บนแพลตฟอร์มของ Intel อีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.