Zottel83
Anmeldungsdatum: 9. Februar 2015
Beiträge: 112
|
Hallo an alle,
ich hätte nach längerer Zeit mal wieder ein kleines Problem. Ich lasse mit einem Script immer ein Backup meiner externen Festplatte via rsync durchführen. Das Script starte ich immer manuell nach Bedarf. Nun hätte ich am Ende gerne noch eine kurze Info, wie lange der Prozess insgesamt gedauert hat.
Leider konnte ich keine Option für rsync finden, die das ermöglicht. Hat da jemand eine Idee wie sich das umsetzen ließe?
|
paraplasma
Anmeldungsdatum: 7. August 2010
Beiträge: 341
Wohnort: Ruhrpott NRW
|
Hallo Zottel83 So eine Option hat rsync meines Wissens nach auch nicht. Aber ich hatte vor kurzem ein ähnliches Anliegen mit der Zeit. Schau mal hier:https://forum.ubuntuusers.de/topic/datum-und-uhrzeit-am-anfang-und-ende-in-einer-/ Am Ende habe ich das fertig Script gepostet. Du kannst das ja an deine Bedürfnisse anpassen.
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5346
|
Zottel83 schrieb: Hat da jemand eine Idee wie sich das umsetzen ließe?
Mit dem Programm time , einfach vornanstellen. Die Angabe nach real zeigt dann die gesamte Laufzeit an. Die Ausgabe kannst du dir mit Parametern auch beliebig formatieren.
|
Mokkujin
Anmeldungsdatum: 2. Mai 2008
Beiträge: 389
Wohnort: Hannover
|
nur für die vollständigkeit 😉
du könntest aber auch im Skript das du zur Sicherung verwendest ein Logfile schreiben. dort pusht du | $(date +%Y.%m.%d %H:%M:%S)
|
bevor du startest rein und danach. dann hast du auch die dauer. time ist aber die bessere wahl 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Zottel83 schrieb:
Nun hätte ich am Ende gerne noch eine kurze Info, wie lange der Prozess insgesamt gedauert hat.
Leider konnte ich keine Option für rsync finden, die das ermöglicht. Hat da jemand eine Idee wie sich das umsetzen ließe?
date +%s (s.u.)
in der bash time rsync ...
| $ start=$(date +%s); sleep 2; end=$(date +%s); echo $((end - start))s
2s
|
|
Zottel83
(Themenstarter)
Anmeldungsdatum: 9. Februar 2015
Beiträge: 112
|
Zunächst mal, danke an alle. Das hilft enorm weiter. Ich habe mich jetzt für den Code von paraplasma entschieden, aber ohne dass ich es in eine Logfile auslagere, denn das braucht es nicht. Nur noch eine Frage dazu. Falls ich den Befehl time benutzen würde, ließe sich der Wert neben real als Variable speichern, so dass ich ihn im Script weiter verwenden kann, als nur für die Ausgabe direkt nach dem rsync durchgelaufen ist?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Du kannst alles, was Programme auf stdout oder stderr ausgeben, mit Shell/Umleitungen weiterleiten und verarbeiten. Du musst nur das Bash-Builtin time und das Programm time (das liegt normalerweise in /usr/bin/time) auseinander halten - letzteres bietet auch die Möglichkeit Zeitangaben formatiert auszugeben und in eine Datei zu schreiben (damit das nicht mit der Ausgabe des beobachteten Programmes vermischt wird): http://manpages.ubuntu.com/manpages/xenial/man1/time.1.html Also z.B. für die Zeit, die ein Befehl benötigt:
$ { time sleep 10; } 2>&1 | grep -Po "(?<=real\t).*"
0m10,001s
$ /usr/bin/time --output command.log --format='"%C" took %e seconds' sleep 10
$ cat command.log
"sleep 10" took 10.00 seconds
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Zottel83 schrieb: Zunächst mal, danke an alle. Das hilft enorm weiter. Ich habe mich jetzt für den Code von paraplasma entschieden,
Du wolltest doch nur die Dauer und keine Zeitstempel: Zottel83 schrieb:
Nun hätte ich am Ende gerne noch eine kurze Info, wie lange der Prozess insgesamt gedauert hat.
Zottel83 schrieb:
Nur noch eine Frage dazu. Falls ich den Befehl time benutzen würde, ließe sich der Wert neben real als Variable speichern, so dass ich ihn im Script weiter verwenden kann, als nur für die Ausgabe direkt nach dem rsync durchgelaufen ist?
Wenn Du die Zeit weiter verarbeiten willst, kannst Du mein Beispiel noch ergänzen: | $ start=$(date +%s); sleep 2; end=$(date +%s); duration=$((end - start)); echo "dauer: $duration"
dauer: 2
|
Der sleep ist natürlich nur ein Platzhalter für den rsync oder was auch immer Du messen willst.
|
Zottel83
(Themenstarter)
Anmeldungsdatum: 9. Februar 2015
Beiträge: 112
|
rklm schrieb: Zottel83 schrieb:
Nur noch eine Frage dazu. Falls ich den Befehl time benutzen würde, ließe sich der Wert neben real als Variable speichern, so dass ich ihn im Script weiter verwenden kann, als nur für die Ausgabe direkt nach dem rsync durchgelaufen ist?
Wenn Du die Zeit weiter verarbeiten willst, kannst Du mein Beispiel noch ergänzen: | $ start=$(date +%s); sleep 2; end=$(date +%s); duration=$((end - start)); echo "dauer: $duration"
dauer: 2
|
Der sleep ist natürlich nur ein Platzhalter für den rsync oder was auch immer Du messen willst.
Soweit verstanden, nur nicht, wozu ich dann vor rsync nochmal time setzten soll (wie du es in deinem ersten Post geschrieben hast), wenn sich die Variable $duration aus (end - start) ergibt und somit völlig unabhängig vom Befehl time funktioniert. Außerdem gibt es noch das Problem, das mit dem Code $ start=$(date +%s); sleep 2; end=$(date +%s); duration=$((end - start)); echo "dauer: $duration"
die Dauer ja lediglich in Sekunden angegeben wird. Ich habe jetzt eine ganze Weile rumprobiert auch mit verschiedenen Parametern. Wenn ich jetzt, wie Mokkujin schieb, $(date +%Y.%m.%d %H:%M:%S) verwende, erhalte ich Fehlermeldungen, weil in diesem Format nicht gerechnet werden kann. Gibt es dazu auch ne Möglichkeit, am Ende eine Gesamtdauer in Tagen, Stunden, Minunten und Sekunden zu bekommen? Bearbeitet von rklm: Unnötiges Zitat entfernt
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Zottel83 schrieb:
Soweit verstanden, nur nicht, wozu ich dann vor rsync nochmal time setzten soll (wie du es in deinem ersten Post geschrieben hast), wenn sich die Variable $duration aus (end - start) ergibt und somit völlig unabhängig vom Befehl time funktioniert.
Das waren zwei alternative Möglichkeiten.
Außerdem gibt es noch das Problem, das mit dem Code $ start=$(date +%s); sleep 2; end=$(date +%s); duration=$((end - start)); echo "dauer: $duration"
die Dauer ja lediglich in Sekunden angegeben wird.
Du hast ja auch nicht spezifiziert, wie Du die Dauer ausgegeben haben möchtest.
Gibt es dazu auch ne Möglichkeit, am Ende eine Gesamtdauer in Tagen, Stunden, Minunten und Sekunden zu bekommen?
Du kannst das relativ einfach in der Shell umrechnen: Du gibst erst dauer / 86400 Tage aus, dann berechnest Du den Rest als dauer % 86400. Dann machst Du mit den Faktoren 3600 und 60 für Stunden und Minuten weiter und gibst am Ende die restlichen Sekunden aus. Das ganze kannst Du natürlich auch in ein separates Skript verpacken, so dass Du es einfach wiederverwenden kannst. Wenn Du Zahlen mit führenden Nullen ausgeben willst, leistet Dir printf gute Dienste.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
Ich würde bei den date -Aufrufen noch -u beziegungsweise --utc als Argument dazu packen, sonst kann man bei Sommer-/Winterzeitumstellungen sehr komische Laufzeiten als Ergebnis bekommen. 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Marc_BlackJack_Rintsch schrieb: Ich würde bei den date -Aufrufen noch -u beziegungsweise --utc als Argument dazu packen, sonst kann man bei Sommer-/Winterzeitumstellungen sehr komische Laufzeiten als Ergebnis bekommen. 😉
Deswegen ist das Rechnen mit den Sekunden seit der Epoche ja auch robuster. Für die Dauer empfiehlt es sich m.E. die Zeit zu messen und dann meinetwegen formatiert auszugeben. Für Einträge in Logs sind Zeitstempel in Localtime (idealerweise mit TZ-Offset) besser, weil man die besser mit seiner eigenen Zeitwahrnehmung korrelieren kann.
|
Zottel83
(Themenstarter)
Anmeldungsdatum: 9. Februar 2015
Beiträge: 112
|
Hallo,
und sorry ich konnte mich nicht eher melden. @rklm auch wenn ich mit deiner Lösung erst noch nicht so recht wusste wie ich es machen soll, habe ich etwas damit rumprobiert und dank ihr hab ich es nun hinbekommen.
So sieht das Script nun aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
#!/bin/bash
echo ""
STARTZEIT=$(date +%s)
date -d@$STARTZEIT "+%x %T Beginn der Datensicherung"
echo ""
rsync -a --delete -p --progress --exclude="$RECYCLE.BIN" /media/NAS1/ /media/NAS-Backup/
end=$(date +%s)
duration=$((end - STARTZEIT))
Tage=$((duration / 86400))
Restsekunden=$((duration - (Tage * 86400)))
Stunden=$((Restsekunden / 3600))
Restsekunden=$((Restsekunden - (Stunden * 3600)))
Minuten=$((Restsekunden / 60))
Sekunden=$((Restsekunden - (Minuten * 60)))
echo ""
echo ""
echo "Die Datensicherung hat $duration Sekunden gedauert"
echo ""
echo "Gesamtdauer: $Tage Tage : $Stunden Stunden : $Minuten Minuten : $Sekunden Sekunden"
echo ""
date "+%x %X ENDE der Datensicherung
|
Das ganze hat bestimmt noch Verbesserungspotential, aber es funktioniert wenigstens ☺ Danke dafür! Bearbeitet von rklm: Syntaxhighlighting
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
Alternative die Tage, Stunden, Minuten, und Sekunden zu berechnen bei der man nicht so grosse ”magische” Konstanten braucht:
| minuten=$((sekunden / 60))
sekunden=$((sekunden % 60))
stunden=$((minuten / 60))
minuten=$((minuten % 60))
tage=$((stunden / 24))
stunden=$((stunden % 24))
|
|
Zottel83
(Themenstarter)
Anmeldungsdatum: 9. Februar 2015
Beiträge: 112
|
Hallo Marc_BlackJack_Rintsch, ja so gehts auch, wieder was gelernt ☺ Danke!
|