it-swarm.com.de

Wie überprüfe ich den Fortschritt beim Ausführen von cp?

Ist es möglich, den Fortschritt der Ausführung des CP-Prozesses zu überprüfen? Einige Prozesse reagieren auf verschiedene KILL-Signale, sodass Sie ihren Status überprüfen können. Ich weiß, dass ich cp mit dem Parameter -v ausführen kann, aber wenn ich das vergessen habe, läuft cp sehr lange und ich möchte wissen, welche Datei kopiert wird oder wie viele bereits kopiert wurden.

59
Petr

Ja, indem Sie stat für die Zieldatei und die lokale Datei ausführen und eine Dateigröße erhalten.

d.h. stat -c "%s" /bin/ls

Und Sie erhalten den Prozentsatz der kopierten Daten, indem Sie die beiden Werte vergleichen

In einer sehr einfachen Implementierung sieht das so aus:

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

In neueren Versionen von Mac OS X können Sie einfach drücken CTRL+T um Fortschritte zu sehen. Aus der OSX 10.6 Manpage für 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."

Schlagen CTRL+T entspricht der Signalisierung des aktuellen Prozesses mit SIGINFO auf BSD-ähnlichen Maschinen, einschließlich OSX.

Dies funktioniert auch für dd (1) .

Ich glaube nicht, dass Linux diesen SIGINFO-Mechanismus hat, und sehe in der GNU-Manpage für cp (1) nichts über Signale, die verwendet werden können, um den Fortschritt zu melden.

43
erco

Wenn Sie viele Dateien kopieren, erhalten Sie mit du -s /path/to/destination Oder find /path/to/destination | wc -l Eine Vorstellung davon, wie viel bereits getan wurde.

Sie können herausfinden, welche Datei mit lsof -p1234 Kopiert wird, wobei 1234 die Prozess-ID von cp ist. Unter vielen Systemen meldet pgrep -x cp Die Prozess-IDs aller laufenden Prozesse mit dem Namen cp. Dies ist möglicherweise nicht sehr nützlich, da die Reihenfolge, in der die Dateien in einem bestimmten Verzeichnis kopiert werden, im Wesentlichen unvorhersehbar ist (in einem großen Verzeichnis unter Linux gibt ls --sort=none An, versuchen Sie mit einem Verzeichnisbaum find).

lsof -p1234 Gibt in der Spalte cp auch an, wie viele Bytes OFFSET bereits für die aktuelle Datei gelesen und geschrieben hat.

Unter Linux gibt es IO Nutzungsstatistiken in /proc/$pid/io (Verwenden Sie erneut die PID des Prozesses cp für $pidf) rchar value ist die Gesamtzahl der Bytes, die der Prozess gelesen hat, und wchar ist die Anzahl der Bytes, die der Prozess geschrieben hat. Dies umfasst nicht nur Daten in Dateien, sondern auch Metadaten in Verzeichnisse. Sie können diese Zahl mit der ungefähren Zahl vergleichen, die mit du /path/to/source (die nur Dateidaten zählt) erhalten wurde. read_bytes und write_bytes enthalten nur das, was aus dem Speicher gelesen oder geschrieben wurde Das heißt, es schließt Terminaldiagnosen und Daten aus, die sich bereits im Cache oder noch in Puffern befinden.

Ein relativ neues Tool, das genau das tut, ist progress (früher cv [coreutils viewer]).

Was ist es?

Dieses Tool kann als Tiny, Dirty, Linux- und OSX-Only C-Befehl beschrieben werden, der nach den grundlegenden Befehlen von coreutils (cp, mv, dd, tar, gzip/gunzip, cat usw.) sucht, die derzeit auf Ihrem System und ausgeführt werden Zeigt den Prozentsatz der kopierten Daten an.

Wie funktioniert es?

Es scannt einfach /proc für interessante Befehle und durchsucht dann die Verzeichnisse fd und fdinfo, um geöffnete Dateien zu finden und Positionen zu suchen, und meldet den Status für die größte Datei.

16
Amr Mostafa

Einer meiner Lieblingstricks dafür (unter Linux) ist es, die PID des Prozesses cp herauszufinden (mit ps | grep cp oder ähnlich) und dann in /proc/$PID/fd/ und /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

Dies zeigt Ihnen, welche Dateien der Prozess geöffnet hat. Wenn Sie sehen möchten, wie weit der Prozess in der Datei ist ...

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

der Parameter pos ist die Position des Lese- (oder Schreib-) Zeigers in Bytes.

14
Jander

Es gibt einige Dinge, die Sie tun können. Sie können strace daran anhängen, um zu sehen, was es tut (Ausgabe kann reichlich sein!):

 strace -p [pid of cp] 

oder Sie könnten lsof erhalten, um Ihnen mitzuteilen, welche Dateien derzeit geöffnet sind:

 Lsof -p [pid of cp] 

Wenn Sie ein großes rekursives cp ausführen, können Sie pwdx verwenden, um das aktuelle Arbeitsverzeichnis abzurufen, das Ihnen möglicherweise eine Vorstellung davon gibt, wie es funktioniert:

 Pwdx [pid of cp] 
7
Flup

Während das OP ausdrücklich die Möglichkeit erwähnt hat, den Fortschritt des Befehls "cp" zu sehen, muss gesagt werden, dass andere Dienstprogramme für dieses spezielle Problem besser geeignet sind.

Zum Beispiel:

rsync -avP FROM TO

zeigt den Fortschritt des Kopierens der FROM-Datei/des Ordners in die TO-Datei/den Ordner an.


# 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

Und rsync zeigt Ihnen, wie viel kopiert wurde (und wie hoch die Übertragungsrate ist). Es funktioniert für einzelne Dateien oder Ordner auf demselben Computer oder im gesamten Netzwerk.

5
Gordon McCrae

Ich möchte cpv hinzufügen, einen kleinen Wrapper für pv, den ich geschrieben habe und der die Verwendung von cp imitiert.

Einfach und nützlich

(enter image description here

Sie können es bekommen hier

2
nachoparker

Sie können eine Echtzeitausgabe des Befehls lsof erhalten, auf den in die Antwort von @ gilles verwiesen wird, indem Sie watch wie folgt verwenden:

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

Das Flag -n1 Setzt das Aktualisierungsintervall auf 1 Sekunde, aber Sie können es für mehr Genauigkeit auf einen niedrigeren Wert wie 0,5 setzen. Der Standardwert beträgt 2 Sekunden.

Sie können den Befehl watch auch mit cp ausführen, indem Sie ein kaufmännisches Und & Verwenden. Um beispielsweise somefile nach /someplace Zu kopieren, können Sie Folgendes tun:

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

Dieses Tool ist ein Linux-Dienstprogrammbefehl, der nach den grundlegenden Befehlen von coreutils (cp, mv, dd, tar, gzip/gunzip, cat usw.) sucht, die derzeit auf Ihrem System ausgeführt werden, und den Prozentsatz der kopierten Daten anzeigt:

https://github.com/Xfennec/cv

1
saidi

Sie können die Dateien am Zielort überprüfen.

Wenn Ihre cp-Befehle so etwas wie cp -a <my_source> <my_dest_folder> Sind, würde ich überprüfen, welche Dateien bereits in <my_dest_folder> Und jeder Dateigröße kopiert wurden, damit ich den Fortschritt sehen kann. Wenn <my_source> Etwas komplex ist (mehrere Ebenen von Verzeichnissen), kann ein kleines Skript den Status überprüfen. Obwohl ein solches Skript etwas E/A verbrauchen könnte, würde es dann vom cp -Prozess nicht verwendet.

1
Huygens

Sie können auch pipeviewer verwenden.

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

Verwenden Sie pv -d:

-d PID[:FD], --watchfd PID[:FD]
Anstatt Daten zu übertragen, beobachten Sie den Dateideskriptor FD des Prozesses PID und zeigen Sie dessen Fortschritt an. […] Wenn nur ein PID angegeben ist, wird dieser Prozess überwacht und alle regulären Dateien und Blockgeräte, die geöffnet werden, werden mit einem Fortschrittsbalken angezeigt. Der Prozess pv wird beendet, wenn der Prozess PID beendet wird.

( Quelle )

Finden Sie die PID Ihres laufenden cp (pidof cp) Heraus. Nehmen wir an, es ist 12345; dann einfach

pv -d 12345

Anmerkungen:

  • Führen Sie pv als denselben Benutzer aus, der cp (oder als root) ausführt.
  • Da beim Kopieren eine Datei gelesen und in die andere geschrieben werden muss, müssen zwei Dateien gleichzeitig überwacht werden.
  • Wenn cp gerade kleine Dateien verarbeitet, werden wahrscheinlich nicht alle in der Ausgabe angezeigt (eine kleine Datei wird möglicherweise zu schnell geschlossen, als dass pv sie aufnehmen könnte). Es werden jedoch einige angezeigt, sodass Sie selbst dann erkennen können, was cp tut.
  • pv -d "$(pidof cp)" funktioniert möglicherweise; Wenn jedoch mehr als ein cp ausgeführt wird, funktioniert dies nicht. Es gibt pidof -s, Das höchstens eine PID zurückgibt, aber Sie können nicht sicher sein, ob es zum richtigen cp -Prozess gehört, wenn es viele gibt.
0