Jak sprawdzić postęp uruchamiania cp?

54

Czy można sprawdzić postęp uruchamiania procesu CP? Niektóre procesy reagują na różne sygnały KILL, abyś mógł sprawdzić, jaki jest ich status. Wiem, że mogę uruchomić cp z parametrem -v, ale co jeśli zapomnę to zrobić, cp działa bardzo długo i chcę wiedzieć, który plik jest kopiowany lub ile już zostało skopiowanych.

Petr
źródło
Większość rozwiązań (w systemie Linux i prawdopodobnie w innych systemach POSIX, takich jak Mac OS X) przestaje działać, gdy operacje odczytu są znacznie szybsze niż operacje zapisu, wyświetlając 100% na długo przed faktycznym zakończeniem. Powodem jest to, że operacje zapisu znajdują się w pamięci podręcznej systemu plików, zanim zostaną faktycznie wykonane. W tym momencie rzeczy są trudne do śledzenia. Ta sztuczka może zmniejszyć różnicę: w innym terminalu while sleep 1 ; do sync ; done.
Stéphane Gourichon

Odpowiedzi:

31

Tak, uruchamiając stat na pliku docelowym i pliku lokalnym i uzyskując rozmiar pliku,

to znaczy stat -c "%s" /bin/ls

I dostajesz procent danych skopiowanych przez porównanie dwóch wartości, to wszystko

W bardzo podstawowej implementacji, która będzie wyglądać następująco:

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
}
stokrotka
źródło
4
nie mam zamiaru publikować duplikatu twojej sugestii, więc tutaj dodałem kod. Mam nadzieję, że nie masz nic przeciwko.
manatwork
@manatwork ah dzięki, byłem po prostu leniwy, dając pełny przykład :-)
stokrotka
Doskonale, dzieje się to w moim zestawie narzędzi na wszystkich serwerach! Dzięki!
ACK_stoverflow
na Linuksie 4, procesor z jednego szybkiego napędu USB na tani micro SD na starym czytniku kart plik 500 MB: cp i synchronizacja zawiesza się przez kilkadziesiąt minut. ale jeśli zarejestruję plik źródłowy i docelowy, otrzymam dokładnie ten sam numer na obu 10 sekundach po uruchomieniu cp.
gcb
40

W najnowszych wersjach Mac OS X możesz po prostu nacisnąć CTRL+, Taby zobaczyć postęp. Ze strony podręcznika OSX 10.6 dla 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."

Trafienie CTRL+ Tjest równoznaczne z sygnalizacją bieżącego procesu za pomocą SIGINFO na maszynach BSD, w tym OSX.

Działa to również dla dd (1) .

Nie sądzę, że Linux ma ten mechanizm SIGINFO i nie widzę niczego na stronie podręcznika GNU dla cp (1) na temat sygnałów, które można wykorzystać do zgłaszania postępów.

erco
źródło
1
Łał! Nie dostarcza mi wielu informacji, ale wystarczy wiedzieć, że mój mvżyje. Dzięki!
Dan Rosenstark
Podaje tylko procent ukończenia dla pojedynczego pliku, który kopiuje po otrzymaniu sygnału. Nie podaje procentu pełnego wykonania całej pracy.
Joe C
21

Gdy kopiujesz wiele plików du -s /path/to/destinationlub find /path/to/destination | wc -ldajesz wyobrażenie o tym, ile już zostało zrobione.

Możesz dowiedzieć się, który plik jest kopiowany, lsof -p1234gdzie 1234 jest identyfikatorem procesu cp. W wielu systemach pgrep -x cpraportuje identyfikatory wszystkich nazwanych uruchomionych procesów cp. Może to nie być bardzo przydatne, ponieważ kolejność kopiowania plików w danym katalogu jest w zasadzie nieprzewidywalna ( ls --sort=nonepowiedzą ci to w dużym katalogu pod Linuksem ; w drzewie katalogów spróbuj find).

lsof -p1234informuje również, ile bajtów cpjuż przeczytało i zapisało dla bieżącego pliku, w OFFSETkolumnie.

Pod Linuksem są statystyki użytkowania IO w /proc/$pid/io(ponownie, użyj PID cpprocesu dla $pidf). rcharWartość jest całkowita liczba bajtów, że proces ma odczytać, a wcharjest to liczba bajtów, że proces jest napisane. Obejmuje to nie tylko dane w plikach, ale także metadane w katalogach. Możesz porównać tę liczbę z przybliżoną liczbą uzyskaną za pomocą du /path/to/source(która zlicza tylko dane pliku). read_bytesi write_bytesobejmuje tylko to, co zostało odczytane lub zapisane z pamięci, tzn. wyklucza diagnostykę terminali i dane znajdujące się już w pamięci podręcznej lub nadal w buforach.

Gilles „SO- przestań być zły”
źródło
4
w czasie rzeczywistym:watch lsof -p1234
mchid
3
Lub wszystko za jednym razem:watch lsof -p`pgrep -x cp`
Mike
15

Względnie nowe narzędzie, które robi dokładnie to, jest postępem (dawniej cv [coreutils viewer]).

Co to jest?

To narzędzie można opisać jako komendę C Tiny, Dirty, Linux-and-OSX-only, która wyszukuje podstawowe komendy coreutils (cp, mv, dd, tar, gzip / gunzip, cat itp.) Aktualnie uruchomione w systemie i wyświetla procent skopiowanych danych.

Jak to działa?

Po prostu skanuje w /procposzukiwaniu interesujących poleceń, a następnie przegląda katalogi fdi fdinfoznajduje otwarte pliki oraz szuka pozycji i raportuje stan największego pliku.

Amr Mostafa
źródło
5
To wykorzystanie jest teraz nazywane postępem: github.com/Xfennec/progress
Taavi Ilves
14

Jedną z moich ulubionych sztuczek (pod Linuksem) jest ustalenie PID cpprocesu (za pomocą ps | grep cplub podobnego), a następnie sprawdzenie /proc/$PID/fd/i /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

To pokaże, jakie pliki otworzył proces. Jeśli chcesz zobaczyć, jak daleko w pliku jest proces ...

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

posparametrem jest pozycja odczytu (zapisu) lub wskaźnika w bajtach.

Jander
źródło
7

Jest kilka rzeczy, które możesz zrobić. Możesz dołączyć stracedo niego, aby zobaczyć, co robi (dane wyjściowe mogą być obfite!):

strace -p [pid of cp]

lub możesz lsofpowiedzieć, które pliki są obecnie otwarte:

lsof -p [pid of cp]

Jeśli używasz dużej rekurencyjnej cp, możesz użyć pwdxbieżącego katalogu roboczego, co może dać ci pojęcie o tym, jak to działa:

pwdx [pid z cp]
Flup
źródło
4

Chociaż OP wyraźnie wspomniał o możliwości zobaczenia, jak postępuje polecenie „cp”, należy powiedzieć, że inne narzędzia są lepsze w tym konkretnym przypadku.

Na przykład:

rsync -avP FROM TO

pokaże postęp kopiowania pliku FROM / do pliku 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

A rsync powie ci, ile to zostało skopiowane (i szybkość transferu) po drodze. Działa z pojedynczymi plikami lub folderami na tym samym komputerze lub w sieci.

Gordon McCrae
źródło
2
Odpowiadasz na złe pytanie. Pytanie, którego szukasz, to: unix.stackexchange.com/questions/2577/... , na które już wspomniano odpowiedź rsync.
mur
1

Co możesz zrobić, to sprawdzić pliki w miejscu docelowym.

Jeśli twoje polecenia CP są podobne cp -a <my_source> <my_dest_folder>, sprawdziłbym, które pliki są już skopiowane <my_dest_folder>i każdy rozmiar pliku, dzięki czemu mogę zobaczyć postęp. Jeśli <my_source>jest to trochę skomplikowane (kilka warstw katalogów), to mały skrypt mógłby sprawdzić status. Chociaż taki skrypt może zużywać trochę I / O, które nie byłyby wtedy używane przez cpproces.

Huygens
źródło
1

To narzędzie jest poleceniem narzędzia Linux, które wyszukuje podstawowe polecenia coreutils (cp, mv, dd, tar, gzip / gunzip, cat itp.) Aktualnie uruchomione w systemie i wyświetla procent skopiowanych danych:

https://github.com/Xfennec/cv

saidi
źródło
1

Chciałbym dodać cpv, małe opakowanie do pvtego, co napisałem, które imituje użycie cp.

Prosty i użyteczny

wprowadź opis zdjęcia tutaj

Możesz go zdobyć tutaj

nachoparker
źródło
0

Możesz także użyć pipeviewer .

for f in *; do
  pv $f > destination/$f
done
użytkownik77376
źródło
0

Użyj pv -d:

-d PID[:FD], --watchfd PID[:FD]
Zamiast przesyłać dane, obejrzyj deskryptor pliku FDprocesu PIDi pokaż jego postęp. […] Jeśli PIDokreślono tylko a , proces ten będzie obserwowany, a wszystkie zwykłe pliki i urządzenia blokowe, które otworzy, zostaną wyświetlone z paskiem postępu. pvProces wyjdzie gdy proces PIDkończy działanie.

( źródło )

Znajdź PID swojego running cp( pidof cp), powiedzmy, że to 12345; to po prostu

pv -d 12345

Uwagi:

  • Uruchom pvjako ten sam użytkownik, który działa cp(lub jako root).
  • Ponieważ kopiowanie oznacza odczyt jednego pliku i zapis do drugiego, należy spodziewać się monitorowania dwóch plików jednocześnie.
  • Jeśli cpobecnie przetwarzane są małe pliki, prawdopodobnie nie zobaczysz ich wszystkich na wyjściu (mały plik może zostać zbyt szybko zamknięty, pvaby go odebrać). Jednak niektóre się pojawią, więc nawet wtedy będziesz w stanie powiedzieć, co cprobi.
  • pv -d "$(pidof cp)"może działać; ale jeśli działa więcej niż jeden cp, to nie zadziała. Jest taki, pidof -sktóry zwraca co najwyżej jeden PID, ale nie możesz być pewien, że będzie należał do właściwego cpprocesu, jeśli jest ich wiele.
Kamil Maciorowski
źródło
-1

Możesz wysłać sygnał do procesu:

kill -SIGUSR1 pid

Jeszcze bardziej przydatne jest utworzenie skryptu, który będzie sondować, dopóki nie naciśniesz Ctrl-C lub proces się zakończy:

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

Działa dla dd. Nie działa dla CP . Może musisz użyć innego sygnału. Kiedyś próbowałem SIGINFO, ale wydaje się, że już nie istnieje na platformie Intel.

JPT
źródło