[solved] Mittels 'pv' den Fortschritt in Logdatei schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: [solved] Mittels 'pv' den Fortschritt in Logdatei schrei

Beitrag von ThorstenS » 07.11.2013 20:56:12

Alles unter /dev/shm/ bleibt im RAM und wird nicht auf Platte geschrieben.
Die Platten performance willst du dir doch nicht durch das unnötige Schreiben eines Logfiles ausbremsen, oder?

Starte kurz vor deinem dd/pv Befehl mit start-stop-daemo ein zwotes Script.
Gib ein pidfile an, so wie z.B. in /etc/init.d/ssh es gemacht wird.
Im zwoten Script kannst du mit einem while true nach einer Wartezeit von ca. 10 Sekunden das Logfile einkürzen, so wie ich es oben schrieb.
Wenn der dd/pv Befehl in der subshell vom 1. Script fertig ist, schießt du ihn elegant mit start-stop-daemo wieder ab. Mehr Mühe würde ich nicht darauf verwenden.

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: [solved] Mittels 'pv' den Fortschritt in Logdatei schrei

Beitrag von pangu » 07.11.2013 22:20:00

ThorstenS hat geschrieben:und lass periodisch ein "uniq /dev/shm/monitor.unsorted > /dev/shm/monitor.sorted" laufen.
wozu? damit würde ich die doppelte Zeilen entfernen, aber das ist ja immer noch nicht das, was ich ursprünglich haben wollte. Bitte versteh mich nicht falsch, ich bin für jeden Tip dankbar. Mir gehts aber nicht immer nur darum, das Ziel zu erreichen, sondern ich möchte dabei immer auch was lernen WIE man es macht und welche Möglichkeiten es gibt und welche am elegantesten/saubersten sind. Um zurück zum Thema zu kommen: mit uniq würde ich doppelte Zeilen vermeiden, dadurch krieg ich aber trotzdem im output file Ausgaben wie:
1
2
3
4
5
6
[...usw]
das wären halt maximal 100 Zeilen, aber das sind eben 99 Zeilen zu viel und überflüssig IMHO. Ich find das nicht sauber genug. Nehmen wir mal theoretisch an, es gäbe einen Praxisfall indem hier counterwise von 1-9999999999999 Zahlen hochgezählt würden. Das wäre eine Datenflut und nicht vertretbar. Daher: ich möchte definitiv immer nur die letzte Zeilenausgabe angezeigt, bzw. geloggt bekommen haben.
ThorstenS hat geschrieben:Achja, falls du Start und Endzeit mitloggen willst...
danke für die Einsicht in dein Skript, aber da nutze ich lieber ganz komfortabel den Befehl 'time'
ThorstenS hat geschrieben:sed kann dir die Datei auch periodisch zurechtstutzen, laut http://www.catonmat.net/blog/sed-one-li ... art-three/ machst du dann einfach ein "sed -i '$!N; /^\(.*\)\n\1$/!P; D' /dev/shm/monitor.unsorted"
Hab diesen Befehl einfach über eine monitor.unsorted drübergejagt, aber die blieb unverändert ??
Zuletzt geändert von Meillo am 21.11.2013 09:37:23, insgesamt 1-mal geändert.
Grund: BB-Tags repariert
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [solved] Mittels 'pv' den Fortschritt in Logdatei schrei

Beitrag von Cae » 08.11.2013 02:08:17

Man koennte das in

Code: Alles auswählen

| while read -r line; do printf '%s\n' "$line" >"$statusfile"; done
reinpipen, das wuerde immer genau eine Zeile lesen und alles in $statusfile damit ueberschreiben.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: [solved] Mittels 'pv' den Fortschritt in Logdatei schrei

Beitrag von pangu » 08.11.2013 11:33:27

klappt irgendwie auch nicht Cae, ich vermute einfach deswegen, weil ja pv das irgendwie buffered und dann erst ausgibt. Das ist ja keine Schleife die dort abläuft, oder nicht? oder hab ich das einfach nur falsch interpretiert und den Befehl falsch konstruiert? Ich habs so versucht gehabt:

Code: Alles auswählen

(dd if=/dev/zero bs=16384 count=131072 | pv -n -p -t -e -r -a -s 2G | dd of=/dev/null) | while read -r line; do printf '%s\n' "$line" 2>test.monitor; done
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [solved] Mittels 'pv' den Fortschritt in Logdatei schrei

Beitrag von Cae » 09.11.2013 01:06:40

Die Umleitung von stderr ist an der verkehrten Stelle, printf schreibt ja schon nach stdout. So sollte es tun:

Code: Alles auswählen

( dd ... | pv ... ) 2>&1 | while read ... printf ... >test.monitor; done
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Mittels 'pv' den Fortschritt in Logdatei schreiben

Beitrag von Meillo » 21.11.2013 09:46:22

(Ich habe den Thread nur ueberflogen, nicht aber im Detail gelesen. Mir scheint, dass vieles schon gesagt worden ist, aber die Klarheit beim uniq-Hinweis hat mir noch gefehlt.)
pangu hat geschrieben: Der Einzeiler sieht dann also so aus (für meinen Test):

Code: Alles auswählen

(dd if=/dev/zero bs=$bs count=$((4294967296 / $bs)) | pv -n -p -t -e -r -a -s 4G | dd of=/dev/null) >test.monitor 2>&1
EDIT: Das einzige was noch blöd ist, daß ca. 2x in der Sekunde eine neue Zeile geschrieben wird. Das bedeutet, daß im Outputfile so was drinstehen wird beim Klonen einer 2TB Platte:
0
0
0
0
0
0
0
0
0
...und nach Stunden immer noch hunderte/tausende Zeilen mit diesen Nullen
5
5
5
5
5
5
5
5
5
5
5
5
...und so weiter...
Wie könnte man das unterbinden, so daß KEINE neue Zeile verwendet wird ?
Du willst verhindern, dass doppelte, identische Zeilen erscheinen? Dann pipe durch uniq(1). Das unterdrueckt Zeilen, die identisch mit der vorherigen Zeile sind.

Code: Alles auswählen

(dd if=/dev/zero bs=$bs count=$((4294967296 / $bs)) | pv -n -p -t -e -r -a -s 4G | dd of=/dev/null) 2>&1 | uniq >test.monitor
Use ed once in a while!

Antworten