Hallo Liste, ich habe ein kleines Script geschrieben, bei dem ein User eine im Rechner 'steckende' CompactFlash-Karte per dd auf Festplatte sichern kann. Leider gibt es bei dd scheinbar keine Möglichkeit, direkt einen Status abzufragen. Da aber das Kopieren der Karte bei z.B. 1 GB Kapazität schon etwas dauert, möchte ich dem User schon ein Feedback geben. In der Manpage zu dd steht, daß mit dem Signal USR1 ein Status auf stderr geschrieben wird. Leider kann ich den irgendwie nicht in meinem Script nutzen, oder auf stdout umleiten oder in eine Datei, um ihn dann auszulesen. Hier ein paar Zeilen aus diesem Script: FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` STATUS=`kill -USR1 $PID 2<&1` kdialog --msgbox $STATUS Wie bekomme ich für den Anfang die Ausgabe des kill-Befehls in die STATUS-Variable? Später will ich das in einer Schleife abfragen und mit einer Progress-Bar anzeigen. Danke schonmal, Jens PS: Ich hoffe, das ist nicht zu OT, aber in suse-devel ist Totentanz angesagt.
On Thu, Dec 23, 2004 at 12:43:16AM +0100, Jens Nixdorf wrote:
FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` STATUS=`kill -USR1 $PID 2<&1`
Kill gibt hier nichts aus, das macht dd. :) Leider kann ich im Moment auch keine Loesung aus dem Aermel schuetteln. Ich hab nur eine Idee, die du verfolgen kannst: fifo=/tmp/dd.$$ # it's better to use mktemp mkfifo "$fifo" dd if=/dev/hdc of="$FILENAME" > "$fifo" 2>&1 & while sleep $update_interval ; do kill -USR1 $PID read .... < "$fifo" done Das ist auf keinen fall funktionstuechtig, nur mal so ein Denkanstoss. /GM
Am Donnerstag, 23. Dezember 2004 00:59 schrieb Gerhard Meier:
Kill gibt hier nichts aus, das macht dd. :)
Im ersten Moment habe ich gar nicht kapiert, was Du mir sagen wolltest! Aber jetzt hab ich es: Mein Fehler war, die Ausgabe von Kill auszuwerten, aber wie Du schon richtig schreibst, gibt kill gar nix aus, sondern dd. Danke, jetzt bin ich ein gutes Stück weiter... mfG, Jens
Am Donnerstag, 23. Dezember 2004 00:43 schrieb Jens Nixdorf:
Hallo Liste,
ich habe ein kleines Script geschrieben, bei dem ein User eine im Rechner 'steckende' CompactFlash-Karte per dd auf Festplatte sichern kann. Leider gibt es bei dd scheinbar keine Möglichkeit, direkt einen Status abzufragen. Da aber das Kopieren der Karte bei z.B. 1 GB Kapazität schon etwas dauert, möchte ich dem User schon ein Feedback geben.
In der Manpage zu dd steht, daß mit dem Signal USR1 ein Status auf stderr geschrieben wird. Leider kann ich den irgendwie nicht in meinem Script nutzen, oder auf stdout umleiten oder in eine Datei, um ihn dann auszulesen.
Hier ein paar Zeilen aus diesem Script:
FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` STATUS=`kill -USR1 $PID 2<&1` ^^^^ Mal abgesehen davon, dass die ermittlung der eigenen PID mit grep + awk ein wenig overzsized ist: steht bei dir wirklich 2<&1 im Script?
-- Gruß MaxX Hinweis 1: PMs an diese Adresse werden automatisch vernichtet. Hinweis 2: Bitte unbedingt beachten: http://www.suse-etikette.de.vu
Am Donnerstag, 23. Dezember 2004 06:11 schrieb Matthias Houdek:
FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` STATUS=`kill -USR1 $PID 2<&1`
^^^^ Mal abgesehen davon, dass die ermittlung der eigenen PID mit grep + awk ein wenig overzsized ist: steht bei dir wirklich 2<&1 im Script?
Ups, nein, da steht 2>&1. Soll stderr auf stdout umleiten. Und zur PID, ich habe zuerst direkt das Beispiel aus der Manpage von dd genommen, aber das habe ich nicht hinbekommen. mfG, Jens
Hallo Jens, hallo Leute, Am Donnerstag, 23. Dezember 2004 00:43 schrieb Jens Nixdorf:
ich habe ein kleines Script geschrieben, bei dem ein User eine im Rechner 'steckende' CompactFlash-Karte per dd auf Festplatte sichern kann. [...]
In der Manpage zu dd steht, daß mit dem Signal USR1 ein Status auf stderr geschrieben wird. Leider kann ich den irgendwie nicht in meinem Script nutzen, oder auf stdout umleiten oder in eine Datei, um ihn dann auszulesen.
Hier ein paar Zeilen aus diesem Script:
FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` ^ Sollte da nicht ein = stehen?
Damit hast Du Dir einen recht seltenen Useless-Award verdient: den useless-use-of-ps-and-grep-and-awk-Award ;-) Und nebenbei bemerkt kannst Du auch noch einen false positive erwischen, weil grep auch sich selbst in der Prozessliste finden könnte. (Um das zu vermeiden, nach '[d]d if=/dev/hdc'] greppen.) Einfacher geht das gewünschte mit PID=$! direkt nach dem dd-Aufruf. siehe auch - man bash, Abschnitt "Special Parameters" [1]) - das Beispiel in man dd ;-)
STATUS=`kill -USR1 $PID 2<&1` kdialog --msgbox $STATUS
Wie bekomme ich für den Anfang die Ausgabe des kill-Befehls in die STATUS-Variable? Später will ich das in einer Schleife abfragen und mit einer Progress-Bar anzeigen.
Wie wärs einfach mit einer Überwachung der Dateigröße der von dd erstellten Datei? ;-) Frohe Weihnachten! Christian Boltz [1] $! ist möglicherweise bash-spezifisch - falls Du Dein Script auch auf anderen Rechnern mit sh statt bash laufen lassen willst, solltest Du das testen. -- Die Signatur will nicht angezeigt werden. Die gewuenschte Signatur ist zur Zeit nicht verfuegbar. Moeglicherweise ist sie gerade im Urlaub oder hat einfach keine Lust angezeigt zu werden. Oder wollen Sie staendig beobachtet werden?
Am Freitag, 24. Dezember 2004 15:59 schrieb Christian Boltz:
FILENAME=`kdialog --getsavefilename ~/backup "*.img | Kartenimages"` dd if=/dev/hdc of=$FILENAME & PID= `ps -aeo "%p %c %a" | grep 'dd if /dev/hdc' | awk '{print $1}'` ^ Sollte da nicht ein = stehen?
normal schon, aber leider gab ps das auch ohne Gleichheitszeichen aus, warum auch immer, also hab ich es weggelassen.
Damit hast Du Dir einen recht seltenen Useless-Award verdient: den useless-use-of-ps-and-grep-and-awk-Award ;-)
Ja, ja, die Anfänger ;)
Und nebenbei bemerkt kannst Du auch noch einen false positive erwischen, weil grep auch sich selbst in der Prozessliste finden könnte. (Um das zu vermeiden, nach '[d]d if=/dev/hdc'] greppen.)
Das stimmt, aber der kommt immer als zweiter Treffer, da ich aber den ersten auswerte ist mir das egal.
siehe auch - man bash, Abschnitt "Special Parameters" [1]) - das Beispiel in man dd ;-)
Hab ich versucht, aber irgendwie nicht hinbekommen.
Wie wärs einfach mit einer Überwachung der Dateigröße der von dd erstellten Datei? ;-)
Auch 'ne gute Idee, da bin ich auch noch gar nicht drauf gekommen!
Frohe Weihnachten!
ebenso... mfG, Jens
participants (4)
-
Christian Boltz
-
Gerhard Meier
-
Jens Nixdorf
-
Matthias Houdek