Як перевірити хід запуску CP?


54

Чи можна перевірити хід запущеного процесу cp? Деякі процеси реагують на різні сигнали KILL, щоб ви могли перевірити, який їх стан. Я знаю, що я можу запустити cp з параметром -v, але що робити, якщо забув це зробити, cp працює дуже довго, і я хочу знати, який файл копіюється, чи скільки вже скопійовано.


Більшість рішень (на Linux та, мабуть, інших POSIX, як-от Mac OS X) виходять з треку, коли операції зчитування набагато швидші, ніж операції запису, показуючи на 100% далеко до фактичного завершення. Причина полягає в тому, що операції запису сидять у кеші файлової системи ще до того, як вони фактично виконані. У цей момент речі важко відстежити. Цей трюк може зменшити розрив: в іншому терміналі while sleep 1 ; do sync ; done.
Стефан Гурішон

Відповіді:


31

Так, запустивши stat на цільовий і локальний файл, і отримайте розмір файлу,

тобто 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
не призначений для публікації дубліката вашої пропозиції, тому я додав тут код. Сподіваюся, ви не проти.
манатура

@manatwork ах, дякую, я просто лінувався надати повний приклад :-)
Дейзі

Відмінно, це відбувається у моїй панелі інструментів на всіх серверах! Дякую!
ACK_stoverflow

на linux 4, cp'ing з одного швидкого usb-накопичувача до дешевого micro sd на старому зчитувачі карт файлом 500 Мб: cp і синхронізація зависають кілька десятків хвилин. але якщо я зафіксував файл вихідного та цільового файлів, я отримаю точно таке ж число на обох 10 секундах після запуску CP.
gcb

40

В останніх версіях Mac OS X ви можете просто натиснути CTRL+, Tщоб побачити прогрес. З основної сторінки 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."

Натискання CTRL+ Tеквівалентно сигналізації поточного процесу за допомогою SIGINFO на машинах BSD-ish, включаючи OSX.

Це працює і для dd (1) .

Я не думаю, що в Linux є цей механізм SIGINFO, і я не бачу нічого на сторінці GNU для cp (1) про сигнали, які можна використовувати для повідомлення про прогрес.


1
Оце Так! Це не дає мені багато інформації, але достатньо, щоб знати, що моя mvжива. Дякую!
Дан Розенстарк

Він лише повідомляє вам відсоток завершеності для окремого файлу, який він копіює, коли приймає сигнал. Це не дає відсотків завершеності всієї роботи, яку він виконує.
Джо C

21

Коли ви копіюєте безліч файлів du -s /path/to/destinationабо find /path/to/destination | wc -lдаєте уявлення про те, скільки вже зроблено.

Ви можете дізнатися, з якого файлу копіюється, lsof -p1234куди 1234 - ідентифікатор процесу 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 Tiny, Dirty, Linux та OSX-Only C, яка шукає основні команди coreutils (cp, mv, dd, tar, gzip / gunzip, cat тощо), які зараз працюють у вашій системі та відображає відсоток скопійованих даних.

Як це працює?

Він просто сканує /procцікаві команди, а потім переглядає каталоги fdта fdinfoзнаходить відкриті файли та шукає позиції та звітує про стан найбільшого файлу.


5
Тепер цей утиліт
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 cp]

або ви можете lsofсказати вам, які файли в даний час відкриті:

lsof -p [pid cp]

Якщо у вас велика рекурсивна система cp, ви можете використовувати pwdxпоточний робочий каталог, який може дати вам уявлення про те, як це відбувається:

pwdx [pid cp]

4

Хоча в ОП конкретно згадується можливість бачити, як просувається команда "cp", слід сказати, що інші утиліти краще для цього конкретного питання.

Наприклад:

rsync -avP FROM TO

покаже хід копіювання файлу / папки FROM у файл 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

І rsync підкаже, скільки його скопійовано (і швидкість передачі) по дорозі. Він працює для окремих файлів або папок як на одній машині, так і в мережі.


2
Ви відповідаєте на неправильне запитання. Ви шукаєте запитання: unix.stackexchange.com/questions/2577/… , на яке вже є відповідь rsync.
муру

1

Що ви можете зробити, це перевірити файли за призначенням.

Якщо ваші команди CP є чимось на зразок, cp -a <my_source> <my_dest_folder>я би перевірив, які файли вже скопійовані <my_dest_folder>та розмір кожного файлу, щоб я міг бачити хід. Якщо <my_source>дещо складний (кілька шарів каталогів), то невеликий скрипт зможе перевірити стан. Хоча такий сценарій може споживати трохи вводу-виводу, який тоді процес не буде використаний cp.


1

Цей інструмент являє собою команду утиліти Linux, яка шукає основні команди coreutils (cp, mv, dd, tar, gzip / gunzip, cat тощо), що працюють у вашій системі та відображає відсоток скопійованих даних:

https://github.com/Xfennec/cv


1

Я хотів би додати cpv, трохи обгортки для pvцього я написав, що імітує використання cp.

Просте і корисне

введіть тут опис зображення

Ви можете отримати його тут



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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.