Cp çalışan ilerleme nasıl kontrol edilir?


54

Cp işleminin ilerlemesini kontrol etmek mümkün mü? Bazı işlemler çeşitli KILL sinyallerine yanıt verir, böylece durumlarını kontrol edebilirsiniz. Cp parametresini -v ile çalıştırabileceğimi biliyorum ama ne yapmayı unuttuysam, cp çok uzun bir süredir çalışıyor ve hangi dosyanın kopyalandığını ya da kaçının kopyalandığını bilmek istiyorum.


Çoğu çözüm (Linux'ta ve muhtemelen Mac OS X gibi diğer POSIX'lerde) okuma işlemleri yazma işlemlerinden çok daha hızlı olduğunda, gerçek işlemin% 100'ünden çok daha önce ortaya çıktığında iz bırakıyor. Bunun nedeni, yazma işlemlerinin aslında gerçekleştirilmeden önce dosya sistemi önbelleğine oturmasıdır. Bu noktada, işleri izlemek zor. Bu numara boşluğu azaltabilir: başka bir terminalde while sleep 1 ; do sync ; done.
Stéphane Gourichon

Yanıtlar:


31

Evet, hedef dosya ve yerel dosyada stat çalıştırarak bir dosya boyutu elde ederek,

yani stat -c "%s" /bin/ls

Ve iki değeri karşılaştırarak kopyalanan veri yüzdesini elde edersiniz.

Bu gibi görünecek çok temel bir uygulamada:

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
Önerinizin bir kopyasını göndermeyi amaçlamadığım için kodu buraya ekledim. Umarım sakıncası yoktur.
Manat çalışması

@ manatwork ah teşekkürler, sadece tam bir örnek vererek tembel oldu :-)
papatya

Mükemmel, bu tüm sunuculardaki araç kutuma giriyor! Teşekkürler!
ACK_stoverflow

Linux 4'te, hızlı bir USB sürücüsünden eski bir kart okuyucusunda ucuz bir micro SD'ye 500 MB'lik bir dosyaya: cp ve birkaç düzine dakika boyunca senk. fakat eğer kaynak ve hedef dosyayı belirlersem, cp başladıktan sonra her iki 10'da da aynı sayıyı alırım.
gcb

40

Mac OS X'in son sürümlerinde, ilerlemeyi görmek için CTRL+ tuşlarına basabilirsiniz T. Gönderen cp için OSX 10.6 kılavuz sayfasında (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."

Vurmak CTRL+ TOSX gibi BSD ish makinelerinde SIGINFO ile mevcut süreç sinyal eşdeğerdir.

Bu, dd (1) için de geçerlidir.

Linux'un bu SIGINFO mekanizmasına sahip olduğunu sanmıyorum ve GNU man sayfasında cp (1) için ilerlemeyi bildirmek için kullanılabilecek sinyaller hakkında hiçbir şey görmüyorum .


1
Vaov! Bana fazla bilgi vermiyor, ama mvyaşadığımı bilmek yeterli . Teşekkürler!
Dan Rosenstark

Yalnızca, tek bir dosya için, sinyal aldığında kopyaladığı yüzdesini gösterir. Yaptığı tüm işin tamamlanma yüzdesini vermez.
Joe C.

21

Çok fazla dosya kopyalarken du -s /path/to/destinationya find /path/to/destination | wc -lda ne kadarının yapıldığı hakkında bir fikir verir.

Hangi dosyanın kopyalandığını lsof -p12341234'ün işlem kimliğinin nerede olduğunu görebilirsiniz cp. Birçok sistemde, pgrep -x cpadlandırılan tüm çalışan işlemlerin işlem kimliklerini bildirir cp. Belirli bir dizindeki dosyaların kopyalanma sırası esasen tahmin edilemez olduğu için bu çok kullanışlı olmayabilir (Linux altındaki büyük bir dizinde ls --sort=nonesize söyleyecektir; bir dizin ağacıyla deneyin find).

lsof -p1234ayrıca cp, geçerli dosya için kaç tane baytın okuduğunu ve yazdığını OFFSETsütununda da gösterir.

Linux altında, IO kullanım istatistikleri vardır /proc/$pid/io(yine, cpişlemin PID'sini kullanın $pidf). rcharDeğeri işlem okuma bayt sayısı ve wcharişlem yazmış bayt sayısıdır. Bu sadece dosyalardaki verileri değil aynı zamanda dizinlerdeki meta verileri de içerir. Bu rakamla elde edilen yaklaşık rakamla du /path/to/source(sadece dosya verilerini sayar) karşılaştırabilirsiniz. read_bytesve write_bytesyalnızca depodan okunan veya yazılanları içerir; yani, önbellekteki veya hala arabelleklerde bulunan terminal tanılama ve verilerini hariç tutar.


4
gerçek zamanlı:watch lsof -p1234
mchid

3
Veya hepsi bir arada:watch lsof -p`pgrep -x cp`
Mike

15

Yapar nispeten yeni bir araç, tam olarak bu ilerleme (eski ev [coreutils görüntüleyici]).

Bu ne?

Bu araç şu anda sisteminizde çalışan coreutils temel komutlarını (cp, mv, dd, tar, gzip / gunzip, cat, vb.) Arayan Küçük, Kirli, Linux ve OSX-Sadece C komutu olarak tanımlanabilir ve kopyalanan verinin yüzdesini görüntüler.

O nasıl çalışır?

Bu sadece tarar /procilginç komutlar için, ve sonra dizinlere bakar fdve fdinfoaçılan dosyaları bulmak ve pozisyonları aramaya ve en büyük dosya için durumu bildirir.



14

(Linux altında) Bunun için benim favori numaralarından biri PID bulmaktır cp(kullanarak süreci ps | grep cpveya benzeri) ve sonra bakmaya /proc/$PID/fd/ve /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

Bu, işlemin hangi dosyaları açtığını gösterecektir. Dosyaya ne kadar uzakta olduğunu görmek istiyorsanız işlem ...

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

posParametre bayt okuma (veya yazma) ibrenin konumudur.


7

Yapabileceğin birkaç şey var. Ne straceyaptığını görmek için ona bağlayabilirsiniz (çıktı çok fazla olabilir!):

strace -p [cp'ın çarpanı]

ya lsofda şu anda hangi dosyaların açık olduğunu size söyleyebiliriz:

lsof -p [cp'nin pid]

Büyük bir özyinelemeli çalıştırıyorsanız , geçerli çalışma dizinini almak için cpkullanabilirsiniz pwdx, bu da size nasıl çalıştığı hakkında bir fikir verebilir:

pwdx [cp'nin çeki]

4

OP, "cp" komutunun nasıl ilerlediğini görebilme özelliğinden bahsetmiş olsa da, bu belirli konu için diğer araçların daha iyi olduğu söylenmelidir.

Örneğin:

rsync -avP FROM TO

FROM dosyasını / klasörünü TO dosyasına / FOLDER'e kopyalama ilerlemesini gösterecektir.


# 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

Ve rsync size yol boyunca ne kadar kopyalandığını (ve aktarım hızını) söyleyecektir. Aynı makinede veya ağdaki tek dosya veya klasör için çalışır.


2
Yanlış soruyu cevaplıyorsun. Aradığınız soru şudur: zaten bir cevaptan bahseden unix.stackexchange.com/questions/2577/…rsync .
muru

1

Yapabilecekleriniz, varış yerindeki dosyaları kontrol etmek.

Eğer cp komutlarınız, cp -a <my_source> <my_dest_folder>hangi dosyaların zaten kopyalandığını <my_dest_folder>ve her bir dosya boyutunu kontrol ettiğimden dolayı, ilerlemeyi görebiliyorum. Eğer <my_source>biraz karmaşıksa (birkaç katman dizini), küçük bir betik durumu kontrol edebilir. Her ne kadar böyle bir komut dosyası, cpişlem tarafından kullanılmayacak olan bir miktar G / Ç tüketebilse de .


1

Bu araç, sisteminizde çalışan coreutils temel komutlarını (cp, mv, dd, tar, gzip / gunzip, cat, vb.) Arayan ve kopyalanan verilerin yüzdesini gösteren bir Linux yardımcı programı komutudur.

https://github.com/Xfennec/cv


1

Eklemek isterim, kullanımını taklit eden için yazdığım cpvküçük bir ambalaj .pvcp

Basit ve kullanışlı

görüntü tanımını buraya girin

Buradan alabilirsiniz



0

Kullanım pv -d:

-d PID[:FD], --watchfd PID[:FD]
Veri aktarmak yerine, FDişlemin dosya tanımlayıcısını izleyin PIDve ilerlemesini gösterin. […] Yalnızca a PIDbelirtilirse, o zaman bu işlem izlenecek ve açtığı tüm normal dosyalar ve blok aygıtları bir ilerleme çubuğu ile gösterilecektir. pvSüreç zaman süreci çıkar PIDçıkar.

( kaynak )

Koşunuzun PID'sini bulun cp( pidof cp), diyelim ki 12345; o zaman basit

pv -d 12345

Notlar:

  • Çalışan pvaynı kullanıcı cpolarak (veya root olarak) çalıştırın.
  • Kopyalama bir dosyayı okumak ve diğerine yazmak anlamına geldiğinden, aynı anda iki dosyanın izlenmesini bekleyin.
  • Eğer cpşu anda küçük dosyalar işliyor, muhtemelen (için küçük bir dosya çok hızlı kapalı alabilirsiniz çıktıda hepsini görmez pvonu almak için). Yine de bazıları görünecek, o zaman bile ne olduğunu söyleyebileceksiniz cp.
  • pv -d "$(pidof cp)"Çalışabilir; ama birden fazla cpkoşma varsa işe yaramaz. Orada pidof -sen fazla bir PID en döndüren, ancak bunun doğru ait olacaktır emin olamaz cpbirçok varsa süreç.

-1

Sürece bir sinyal gönderebilirsiniz:

kill -SIGUSR1 pid

Siz Ctrl-C'ye basana veya işlem bitene kadar sorgulayan bir komut dosyası oluşturmak daha yararlıdır:

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

DD için çalışıyor. Cp için çalışmıyor . Belki başka bir sinyal kullanmalısın. Bir keresinde SIGINFO'yu denedim ama artık Intel platformunda görünmüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.