web-dev-qa-db-fra.com

Comment vérifier la progression de l'exécution de cp?

Est-il possible de vérifier la progression de l'exécution du processus cp? Certains processus répondent à divers signaux KILL afin que vous puissiez vérifier leur statut. Je sais que je peux exécuter cp avec le paramètre -v mais qu'en est-il si j'ai oublié de le faire, cp fonctionne depuis très longtemps et je veux savoir quel fichier est copié ou combien ont déjà été copiés.

59
Petr

Oui, en exécutant stat sur le fichier cible et le fichier local, et obtenez une taille de fichier,

c'est à dire stat -c "%s" /bin/ls

Et vous obtenez le pourcentage de données copiées en comparant les deux valeurs, c'est tout

Dans une implémentation très basique qui ressemblera à ceci:

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
}
32
daisy

Sur les versions récentes de Mac OS X, vous pouvez simplement appuyer sur CTRL+T pour voir les progrès. Depuis la page de manuel OSX 10.6 pour 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."

Frappe CTRL+T équivaut à signaler le processus actuel avec SIGINFO sur les machines BSD, y compris OSX.

Cela fonctionne également pour dd (1) .

Je ne pense pas que Linux dispose de ce mécanisme SIGINFO, et je ne vois rien dans la page de manuel GNU pour cp (1) sur les signaux qui peuvent être utilisés pour signaler les progrès.

43
erco

Lorsque vous copiez de nombreux fichiers, du -s /path/to/destination ou find /path/to/destination | wc -l vous donne une idée de ce qui a déjà été fait.

Vous pouvez savoir quel fichier est copié avec lsof -p1234 où 1234 est l'ID de processus de cp. Dans de nombreux systèmes, pgrep -x cp indique les ID de processus de tous les processus en cours d'exécution nommés cp. Cela peut ne pas être très utile car l'ordre dans lequel les fichiers d'un répertoire donné sont copiés est essentiellement imprévisible (dans un grand répertoire sous Linux, ls --sort=none vous le dira; avec une arborescence de répertoires, essayez find).

lsof -p1234 vous indique également combien d'octets cp a déjà lu et écrit pour le fichier actuel, dans la colonne OFFSET.

Sous Linux, il y a IO statistiques d'utilisation dans /proc/$pid/io (encore une fois, utilisez le PID du processus cp pour $pidf). La valeur rchar est le nombre total d'octets que le processus a lu et wchar est le nombre d'octets que le processus a écrit. Cela inclut non seulement les données dans les fichiers mais aussi les métadonnées dans les répertoires. Vous pouvez comparer ce chiffre avec le chiffre approximatif obtenu avec du /path/to/source (qui ne compte que les données du fichier). read_bytes et write_bytes n'inclut que ce qui a été lu ou écrit depuis le stockage, c'est-à-dire qu'il exclut les diagnostics du terminal et les données déjà dans le cache ou encore dans les tampons.

Un outil relativement nouveau qui fait exactement cela est progress (anciennement cv [coreutils viewer]).

Qu'Est-ce que c'est?

Cet outil peut être décrit comme une commande C minuscule, sale, Linux et OSX uniquement qui recherche les commandes de base de coreutils (cp, mv, dd, tar, gzip/gunzip, cat, etc.) en cours d'exécution sur votre système et affiche le pourcentage de données copiées.

Comment ça marche?

Il scanne simplement /proc pour les commandes intéressantes, puis examine les répertoires fd et fdinfo pour trouver les fichiers ouverts et rechercher des positions, et signale l'état du plus gros fichier.

16
Amr Mostafa

Une de mes astuces préférées pour cela (sous Linux) est de trouver le PID du processus cp (en utilisant ps | grep cp ou similaire), puis dans /proc/$PID/fd/ et /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

Cela vous montrera quels fichiers le processus a ouverts. Si vous voulez voir dans quelle mesure le fichier est en cours ...

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

le paramètre pos est la position du pointeur de lecture (ou d'écriture), en octets.

14
Jander

Il y a quelques choses que vous pouvez faire. Vous pouvez y attacher strace pour voir ce qu'il fait (la sortie peut être copieuse!):

 strace -p [pid de cp] 

ou vous pourriez obtenir lsof pour vous dire quels fichiers il a actuellement ouverts:

 lsof -p [pid de cp] 

Si vous exécutez un gros cp récursif, vous pouvez utiliser pwdx pour obtenir le répertoire de travail actuel, ce qui peut vous donner une idée de son fonctionnement:

 pwdx [pid de cp] 
7
Flup

Bien que l'OP ait spécifiquement mentionné la possibilité de voir comment la commande "cp" progresse, il faut dire que d'autres utilitaires sont meilleurs pour ce problème particulier.

Par exemple:

rsync -avP FROM TO

affichera la progression de la copie du fichier/dossier FROM dans le fichier/dossier TO.


# 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

Et rsync vous dira combien il est copié (et le taux de transfert) en cours de route. Il fonctionne pour des fichiers ou dossiers uniques sur la même machine ou sur le réseau.

5
Gordon McCrae

Je voudrais ajouter cpv, un petit wrapper pour pv que j'ai écrit qui imite l'utilisation de cp.

Simple et utile

enter image description here

Vous pouvez l'obtenir ici

2
nachoparker

Vous pouvez obtenir une sortie en temps réel de la commande lsof référencée dans la réponse par @ gilles en utilisant watch comme ceci:

watch -n1 lsof -p$(pgrep -x cp)

Le -n1 flag définit l'intervalle de mise à jour à 1 seconde, mais vous pouvez le définir sur quelque chose de inférieur à 0,5 pour plus de précision. La valeur par défaut est de 2 secondes.

Vous pouvez également exécuter la commande watch avec cp en utilisant une esperluette &. Par exemple, pour copier somefile vers /someplace, tu peux le faire:

cp somefile /someplace & watch lsof -n1 -p$(pgrep -x cp)
1
mchid

Cet outil est une commande utilitaire Linux qui recherche les commandes de base de coreutils (cp, mv, dd, tar, gzip/gunzip, cat, etc.) en cours d'exécution sur votre système et affiche le pourcentage de données copiées:

https://github.com/Xfennec/cv

1
saidi

Ce que vous pouvez faire est de vérifier les fichiers à destination.

Si vos commandes cp sont quelque chose comme cp -a <my_source> <my_dest_folder> Je vérifierais quels fichiers sont déjà copiés dans <my_dest_folder> et chaque taille de fichier, afin que je puisse voir la progression. Si la <my_source> est un peu complexe (plusieurs couches de répertoires) alors un petit script serait capable de vérifier l'état. Bien qu'un tel script puisse consommer un peu d'E/S qui ne seraient alors pas utilisées par le processus cp.

1
Huygens

Vous pouvez également utiliser pipeviewer .

for f in *; do
  pv $f > destination/$f
done
0
user77376

Utilisez pv -d:

-d PID[:FD], --watchfd PID[:FD]
Au lieu de transférer des données, regardez le descripteur de fichier FD du processus PID et affichez sa progression. […] Si seul un PID est spécifié, alors ce processus sera surveillé, et tous les fichiers normaux et les périphériques bloqués qu'il ouvrira seront affichés avec une barre de progression. Le processus pv se termine lorsque le processus PID se termine.

( source )

Découvrez le PID de votre cp en cours d'exécution (pidof cp), Disons que c'est 12345; puis simplement

pv -d 12345

Remarques:

  • Exécutez pv en tant que même utilisateur qui exécute cp (ou en tant que root).
  • Étant donné que copier signifie lire un fichier et écrire dans l'autre, attendez-vous à ce que deux fichiers soient surveillés à la fois.
  • Si cp traite actuellement de petits fichiers, vous ne les verrez probablement pas tous dans la sortie (un petit fichier peut se fermer trop rapidement pour que pv le récupère). Pourtant, certains apparaîtront, donc même alors vous pourrez dire ce que fait cp.
  • pv -d "$(pidof cp)" peut fonctionner; mais s'il y a plus d'un cp en cours d'exécution, cela ne fonctionnera pas. Il y a pidof -s Qui renvoie au plus un PID, mais vous ne pouvez pas être sûr qu'il appartiendra au bon processus cp s'il y en a plusieurs.
0
Kamil Maciorowski