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.
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
}
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.
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épertoiresfd
etfdinfo
pour trouver les fichiers ouverts et rechercher des positions, et signale l'état du plus gros fichier.
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.
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]
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.
Je voudrais ajouter cpv
, un petit wrapper pour pv
que j'ai écrit qui imite l'utilisation de cp
.
Simple et utile
Vous pouvez l'obtenir ici
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)
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:
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
.
Vous pouvez également utiliser pipeviewer .
for f in *; do
pv $f > destination/$f
done
Utilisez pv -d
:
-d PID[:FD], --watchfd PID[:FD]
Au lieu de transférer des données, regardez le descripteur de fichierFD
du processusPID
et affichez sa progression. […] Si seul unPID
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 processuspv
se termine lorsque le processusPID
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:
pv
en tant que même utilisateur qui exécute cp
(ou en tant que root).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.