Як перевірити хід запуску 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.