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.
54
while sleep 1 ; do sync ; done
.Odpowiedzi:
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:
źródło
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) :
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.
źródło
mv
żyje. Dzięki!Gdy kopiujesz wiele plików
du -s /path/to/destination
lubfind /path/to/destination | wc -l
dajesz wyobrażenie o tym, ile już zostało zrobione.Możesz dowiedzieć się, który plik jest kopiowany,
lsof -p1234
gdzie 1234 jest identyfikatorem procesucp
. W wielu systemachpgrep -x cp
raportuje identyfikatory wszystkich nazwanych uruchomionych procesówcp
. Może to nie być bardzo przydatne, ponieważ kolejność kopiowania plików w danym katalogu jest w zasadzie nieprzewidywalna (ls --sort=none
powiedzą ci to w dużym katalogu pod Linuksem ; w drzewie katalogów spróbujfind
).lsof -p1234
informuje również, ile bajtówcp
już przeczytało i zapisało dla bieżącego pliku, wOFFSET
kolumnie.Pod Linuksem są statystyki użytkowania IO w
/proc/$pid/io
(ponownie, użyj PIDcp
procesu dla$pidf
).rchar
Wartość jest całkowita liczba bajtów, że proces ma odczytać, awchar
jest 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_bytes
iwrite_bytes
obejmuje 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.źródło
watch lsof -p1234
watch lsof -p`pgrep -x cp`
Względnie nowe narzędzie, które robi dokładnie to, jest postępem (dawniej cv [coreutils viewer]).
Co to jest?
Jak to działa?
źródło
Jedną z moich ulubionych sztuczek (pod Linuksem) jest ustalenie PID
cp
procesu (za pomocąps | grep cp
lub podobnego), a następnie sprawdzenie/proc/$PID/fd/
i/proc/$PID/fdinfo/
.To pokaże, jakie pliki otworzył proces. Jeśli chcesz zobaczyć, jak daleko w pliku jest proces ...
pos
parametrem jest pozycja odczytu (zapisu) lub wskaźnika w bajtach.źródło
Jest kilka rzeczy, które możesz zrobić. Możesz dołączyć
strace
do niego, aby zobaczyć, co robi (dane wyjściowe mogą być obfite!):lub możesz
lsof
powiedzieć, które pliki są obecnie otwarte:Jeśli używasz dużej rekurencyjnej
cp
, możesz użyćpwdx
bieżącego katalogu roboczego, co może dać ci pojęcie o tym, jak to działa:źródło
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:
pokaże postęp kopiowania pliku FROM / do pliku TO / FOLDER.
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.
źródło
rsync
.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 przezcp
proces.źródło
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
źródło
Chciałbym dodać
cpv
, małe opakowanie dopv
tego, co napisałem, które imituje użyciecp
.Prosty i użyteczny
Możesz go zdobyć tutaj
źródło
Możesz także użyć pipeviewer .
źródło
Użyj
pv -d
:( źródło )
Znajdź PID swojego running
cp
(pidof cp
), powiedzmy, że to 12345; to po prostuUwagi:
pv
jako ten sam użytkownik, który działacp
(lub jako root).cp
obecnie przetwarzane są małe pliki, prawdopodobnie nie zobaczysz ich wszystkich na wyjściu (mały plik może zostać zbyt szybko zamknięty,pv
aby go odebrać). Jednak niektóre się pojawią, więc nawet wtedy będziesz w stanie powiedzieć, cocp
robi.pv -d "$(pidof cp)"
może działać; ale jeśli działa więcej niż jedencp
, to nie zadziała. Jest taki,pidof -s
który zwraca co najwyżej jeden PID, ale nie możesz być pewien, że będzie należał do właściwegocp
procesu, jeśli jest ich wiele.źródło
Możesz wysłać sygnał do procesu:
Jeszcze bardziej przydatne jest utworzenie skryptu, który będzie sondować, dopóki nie naciśniesz Ctrl-C lub proces się zakończy:
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.
źródło