PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Script mit Wget und Statusanzeige



kruemelchen26
24-01-2008, 10:34
Hallo Leute,

als erstes möchte ich Euch sagen, das ich ein Neuling ind der Bashprogrammierung bin.

Ich schreibe gerade ein kleines Script, das mir einige Daten per wget downloaden soll, entpacken und anschliessend kompilieren soll. Soweit ist eigentlich auch alles in Ordnung und funktioniert.

Zur besseren Übersicht möchte ich jedoch bei wget nun die Ausgabe unterdrücken und stattdessen mir ein drehendes | anzeigen lassen bis wget mit dem download abgeschlossen hat.

Hier nun mal so ein Ansatz der aber nicht funktioniert:


#!/bin/bash

DL=`wget -q http://1.1.1.1/irgendwas.tar.gz -O irgendwas-123.tar.gz`
if [ "$DL" -eq 1 ]
then
for SIGN in "/" "-" "\\" "|"; do
echo -ne "\e[u$SIGN"
sleep 0.1
done
else
echo "... Fertig !"
fi


Wie müsste ich das nun machen, damit dies auch funktioniert? Hat jemand einen Tipp für mich?

Grüße Marko

peschmae
24-01-2008, 18:43
Du kannst wget schon mit einem & in den Hintergrund schicken; nur hast du dann Kommunikationsprobleme...

Ich würde mir das nicht antun.

Wenns sein muss dann sowas:
a) ein anderes Downloadtool suchen das den Outputstyle kann den du willst
b) eine Scriptsprache wählen die multithreading vernünftig unterstützt und dein Zeugs damit implementieren (Perl, Python, Ruby, irgendwas...)
c) wget entsprechend erweitern (was du brauchst wäre einen progressbar-style der aus \ - / besteht und eine Abwandlung der Option --quiet die trotzdem den Progressbar-Output ausgibt...

MfG Peschmä

jan61
24-01-2008, 20:12
...Zur besseren Übersicht möchte ich jedoch bei wget nun die Ausgabe unterdrücken und stattdessen mir ein drehendes | anzeigen lassen bis wget mit dem download abgeschlossen hat....

Probier es mal so (so, gleich noch getestet):


# meine Progressbar als Array
SIGN=("/" "-" "\\" "|" "/" "-" "\\" "|")
# der naechste anzuzeigende Index der Progressbar
S_NO=0
# wget mit Shell-Mitteln in den Hintergrund schicken
wget -q http://1.1.1.1/irgendwas.tar.gz -O irgendwas-123.tar.gz &
# Die PID des wget
WGET_ID=$!
# Warteschleife solange, wie der Prozess noch lebt
while ps -p $WGET_ID >/dev/null; do
# Progressbar fortpflanzen
echo -ne "\r${SIGN[$S_NO]}"
# warten
sleep 0.1
# naechster Index der Progressbar
S_NO=`expr $S_NO + 1`
# bei Maximum zurueck auf 1. Index
test $S_NO -gt 7 && S_NO=0
done
# nach wget-Ende
echo "...Fertig!" Jan

EDIT: Ähm - vielleicht die sleep-Zeit etwas raufsetzen, damit nicht 10x pro Sekunde ein ps abgefeuert wird - der Rechner freut sich sicher ;-)

ContainerDriver
24-01-2008, 22:10
Man kann es auch so machen:


#!/bin/sh

wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.14.tar.bz2 2>&1|while read -d "" -n 512; do
echo "Hallo";
sleep 0.5;
done;
.

Allerdings muss man mit dem -n Parameter für read etwas spielen.

Wusste übrigens nicht, dass sleep auch mit Kommazahlen umgehen kann.

Gruß, Florian

jan61
24-01-2008, 22:38
...Wusste übrigens nicht, dass sleep auch mit Kommazahlen umgehen kann...

Nur der GNU-sleep. Alle anderen mosern rum.

Jan

EDIT: Bei Deinem Vorschlag ist aber die Fortschrittsanzeige sehr abhängig von der Download-Geschwindigkeit - es zuckt ja nur dann, wenn auf der Leitung was passiert. Aber das kann ja auch gewollt sein ;-)

Noch was: BITTE - probiert jetzt nicht alle mit der URL rum, die ContainerDriver gepostet hat, nur um ein paar Hallo's zu sehen. Sucht Euch irgendwas raus - am besten von Eurer Homepage ;-)

jan61
24-01-2008, 23:28
Moin,

bei dem Thema habe ich Blut geleckt ;-). Wie wäre es mit einer Fortschrittsanzeige, die einen fortlaufenden Balken und jeweils beim Erreichen einer Maximalbreite (und damit eines definierten Zeitintervalls) einen Zwischenstand sowie zum Schluss die Endergebnisse (verstrichene Zeit, erreichte Downloadgröße und Downloadrate) anzeigt?

Das folgende Script ist nicht 100% wasserdicht, wer es universell einsetzen will, sollte schon noch ein wenig Hand anlegen beim Fehlerhandling usw., aber es sieht ganz nett in der Konsole aus, finde ich:
#! /bin/bash

# eine ganze Site holen
# site=www.blablub_seite.de/das_interessiert_mich
# alternativ: Eine Datei holen
wget_file=diese/datei/will/ich/haben

# Ausgabebreite der Progressbar
pg_width=30
# Zaehler fuer Progressbar-Laenge
pg_idx=0
# das wird eine ganze leere Zeile zum Ueberschreiben
pg_empty=

# Fuellen der leeren Zeile
for i in `seq 0 $pg_width`; do
pg_empty="$pg_empty "
done

# Startzeit merken und wget abfeuern
s_time=`date +%s`
# Site holen
# wget -qr http://$site &
# Alternativ: Eine Datei holen
wget -q http://$wget_file -O `basename $wget_file` &
# die PID des wget
wget_id=$!
# vorsichtshalber bei Programmabbruch auch den wget abschiessen
trap "kill $wget_id 2>/dev/null" 1 2 3 5 6

# Warteschleife, bis wget fertig ist
while ps -p $wget_id >/dev/null; do

# Fortschrittsanzeige
echo -ne "\b=>"
# hochzaehlen fuer Neustart
pg_idx=`expr $pg_idx + 1`

# Ausgabebreite erreicht: Zeitmessung, Downloadgroesse ermitteln, Anzeige
if test $pg_idx -ge $pg_width; then
# Dateigroesse fuer Download einer Site
# fsize=`du -sk \`dirname $site\` | sed 's/\s.*//'`
# Alternativ: Dateigroesse
fsize=`expr \`stat -c %s \\\`basename $wget_file\\\`\` / 1024`
intvl=`expr \`date +%s\` - $s_time`
printf " %6d s; %6d kB; %3d kB/s" $intvl $fsize `expr $fsize / $intvl`
pg_idx=0
# Anfang der Zeile saubermachen fuer naechste Progressbar
echo -ne "\r$pg_empty\r"
fi
# ein wenig pennen
sleep 0.1
done

# Abschlussmeldung
# Dateigroesse fuer Download einer Site
# fsize=`du -sk \`dirname $site\` | sed 's/\s.*//'`
# Alternativ: Dateigroesse
fsize=`expr \`stat -c %s \\\`basename $wget_file\\\`\` / 1024`
intvl=`expr \`date +%s\` - $s_time + 1`
printf "\r%-${pg_width}s %6d s; %6d kB; %3d kB/s\n" "Fertig [$site$wget_file]" \
$intvl $fsize `expr $fsize / $intvl`

# und wech
exit 0
Jan

EDIT: Ein Hinweis - bei der Abschlussmeldung wird zeitmäßig ein wenig geschummelt. Ich habe bei der Berechnung von $intvl eine 1 addiert, um diese hässliche Fehlermeldung "expr: Teilung durch Null" bei sehr schnellen Downloads zu verhindern. Man kann das natürlich auch sauber abfangen, aber sooo wichtig sind die gemeldeten Downloadraten ja nun auch nicht ;-)