Como verificar o progresso da execução do cp?

52

É possível verificar o progresso da execução do processo de CP? Alguns processos respondem a vários sinais KILL para que você possa verificar qual é o seu status. Eu sei que eu posso rodar o cp com o parâmetro -v mas e se esqueci de fazer isso, o cp está rodando por muito tempo e eu quero saber qual arquivo está sendo copiado, ou quantos já foram copiados.

    
por Petr 04.03.2013 / 11:40

12 respostas

30

Sim, executando stat no arquivo de destino e no arquivo local e obtendo um tamanho de arquivo

ou seja, stat -c "%s" /bin/ls

E você obtém a porcentagem de dados copiados comparando os dois valores, é isso

Em uma implementação muito básica que se parece com isso:

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
}
    
por 04.03.2013 / 11:47
36

Em versões recentes do Mac OS X você pode simplesmente pressionar CTRL + T para ver o progresso. A partir da página de manual do OSX 10.6 para 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."

Acertar CTRL + T é equivalente a sinalizar o processo atual com SIGINFO em máquinas BSD-ish, incluindo OSX.

Isso funciona para dd (1) também.

Eu não acho que o Linux tenha esse mecanismo SIGINFO e não veja nada na página man do GNU para cp (1) sobre sinais que podem ser usados para relatar progresso.

    
por 21.11.2013 / 21:40
21

Quando você copia muitos arquivos, du -s /path/to/destination ou find /path/to/destination | wc -l dá uma ideia de quanto já foi feito.

Você pode descobrir qual arquivo está sendo copiado com lsof -p1234 , em que 1234 é o ID do processo de cp . Em muitos sistemas, pgrep -x cp informa os IDs de processo de todos os processos em execução denominados cp . Isso pode não ser muito útil, pois a ordem em que os arquivos dentro de um determinado diretório são copiados é essencialmente imprevisível (em um diretório grande no Linux, ls --sort=none dirá a você; com uma árvore de diretórios, tente find ).

lsof -p1234 também informa quantos bytes cp já leram e gravaram para o arquivo atual, na coluna OFFSET .

No Linux, há estatísticas de uso do IO em /proc/$pid/io (novamente, use o PID do cp process for $pidf ). O valor rchar é o número total de bytes que o processo leu e wchar é o número de bytes que o processo gravou. Isso inclui não apenas dados em arquivos, mas também metadados em diretórios. Você pode comparar esse valor com o valor aproximado obtido com du /path/to/source (que conta apenas os dados do arquivo).   read_bytes e write_bytes incluem apenas o que foi lido ou gravado do armazenamento, ou seja, exclui diagnósticos do terminal e dados já armazenados em cache ou ainda em buffers.

    
por 06.03.2013 / 01:29
14

Um dos meus truques favoritos para isso (no Linux) é descobrir o PID do processo cp (usando ps | grep cp ou similar) e, em seguida, consultar /proc/$PID/fd/ e /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

Isso mostrará quais arquivos o processo abriu. Se você quiser ver até onde o arquivo está, o processo é ...

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

o parâmetro pos é a posição do ponteiro de leitura (ou gravação), em bytes.

    
por 02.08.2013 / 21:25
13

Uma ferramenta relativamente nova que faz exatamente isso é progresso (anteriormente cv [coreutils viewer]).

O que é isso?

This tool can be described as a Tiny, Dirty, Linux-and-OSX-Only C command that looks for coreutils basic commands (cp, mv, dd, tar, gzip/gunzip, cat, etc.) currently running on your system and displays the percentage of copied data.

Como funciona?

It simply scans /proc for interesting commands, and then looks at directories fd and fdinfo to find opened files and seek positions, and reports status for the largest file.

    
por 22.11.2014 / 13:43
7

Existem algumas coisas que você pode fazer. Você pode anexar strace para ver o que está fazendo (a saída pode ser copiosa!):

strace -p [pid of cp]

ou você pode obter lsof para informar quais arquivos estão abertos no momento:

lsof -p [pid of cp]

Se você estiver executando um cp recursivo grande, poderá usar pwdx para obter o diretório de trabalho atual, o que pode dar uma ideia de como ele está sendo feito:

pwdx [pid of cp]
    
por 04.03.2013 / 11:43
4

Embora o OP tenha mencionado especificamente a capacidade de ver como o comando "cp" está progredindo, é preciso dizer que outros utilitários são melhores para esse problema específico.

Por exemplo:

rsync -avP FROM TO

mostrará o progresso de copiar o arquivo / pasta FROM para o arquivo 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

O rsync lhe dirá quanto é copiado (e a taxa de transferência) ao longo do caminho. Funciona para arquivos únicos ou pastas na mesma máquina ou em toda a rede.

    
por 12.11.2015 / 16:47
1

O que você pode fazer é verificar os arquivos no destino.

Se seus comandos cp forem parecidos com cp -a <my_source> <my_dest_folder> , eu verificaria quais arquivos já foram copiados em <my_dest_folder> e cada tamanho de arquivo, para que eu possa ver o progresso. Se o <my_source> for um pouco complexo (várias camadas de diretórios), um script pequeno poderá verificar o status. Embora esse script possa consumir um pouco de E / S que não seria usado pelo processo cp .

    
por 04.03.2013 / 11:46
1

Esta ferramenta é um comando do utilitário Linux que procura por comandos básicos do coreutils (cp, mv, dd, tar, gzip / gunzip, cat etc.) atualmente em execução no sistema e exibe a porcentagem de dados copiados:

link

    
por 05.04.2015 / 15:21
1

Eu gostaria de adicionar cpv , um pequeno wrapper para pv que eu escrevi que imita o uso de cp .

Simples e útil

Vocêpodeobter aqui

    
por 14.09.2017 / 09:34
0

Você também pode usar o pipeviewer .

for f in *; do
  pv $f > destination/$f
done
    
por 13.03.2016 / 09:36
-1

Você pode enviar um sinal para o processo:

kill -SIGUSR1 pid

É ainda mais útil criar um script que pesquise até que você pressione Ctrl-C ou o processo esteja concluído:

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

Funciona para dd. Não funciona para o cp . Talvez você tenha que usar outro sinal. Uma vez eu tentei SIGINFO, mas parece que não existe mais na plataforma Intel.

    
por 30.09.2014 / 19:56

Tags