Toon posts:

[BASH-Scripting] Voortgang

Pagina: 1
Acties:
  • 52 views sinds 30-01-2008

Verwijderd

Topicstarter
Ja ik heb al de search gebruikt en nee ik kon niet echt nuttige dingen vinden op mijn probleem.

Ik ben bezig met een scriptje die dingen installeerd. Nu is het de bedoeling dat mijn scriptje aangeeft (dat) hij nog bezig is.

Dit bijvoorbeeld dat hij om de halve sec. een hek je op het beeldscherm zet:

# -> ## -> ### -> #### -> ##### -> ############### enz....

of dit bijvoorbeeld doormiddel van zo'n bewegende slash ( | / - \ )

enig idee hoe ik dit moet doen als ik het bestand de volgede opdracht uitvoer:

wget http://apache.surfnet.nl/httpd/apache_1.3.29.tar.gz 2> /tmp/install.log

Alvast bedankt!

[ Voor 4% gewijzigd door Verwijderd op 05-05-2004 14:05 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

wget geeft standaard toch ook de voortgang al aan? Waarom pipe je die momenteel naar install.log toe? Wil je het daar opslaan?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • lordgandalf
  • Registratie: Februari 2002
  • Laatst online: 13-02 15:00
door die pipe naar die log file toont wget volgens mij de voortgang niet

met tee zouw je iets moeten kunnen regelen denk ik

dus ik zouw zeggen man tee

en zie daar

DESCRIPTION
Copy standard input to each FILE, and also to standard output.

zo krijg je en je progress log en toon je netjes de wget progress bar moet je alleen nog ff uit zoeken hoe het precies moet want dat weet ik niet precies

[ Voor 24% gewijzigd door lordgandalf op 05-05-2004 14:21 ]

Steam: Profile / Socialclub: Profile / Uplay: minedwarf / Origin: lordgandalf3


Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
/start/een/applicatie/in/de/background &
PID=$!
INTERVAL=5
while :; do
    if [ -d /proc/${PID} ]; then
        echo -e "#"
    else
        echo "klaar :)"
        break
    fi
    sleep ${INTERVAL}
done

Kan ook met zo'n mooi \|/ achtig iets, maar dat is meer werk :P

[ Voor 64% gewijzigd door Verwijderd op 05-05-2004 14:25 ]


Verwijderd

als je de voortgang van wget zelf wilt weergeven, dat wordt ernstig lastig (je moet dan de output van wget gaan parsen, gaan forken, en dan nog communicatie tussen wget en je script opzetten),
zie boven

maar je kan wget 't zelf laten doen, das veel makkelijker, en als je errors en dergelijke wilt opvangen voor in je install.log , kijk je naar de exit code van wget en zet je zelf iets in je log
bijv onderstaand commando direct na de regel met wget erin
code:
1
echo "wget returned with exit code $?" >> /tmp/install.log


kijk ook eens naar de --progress optie van wget, daarmee kan je de progress indicator veranderen naar eigen smaak

@r3boot $! is toch de exit code van je voorgaande cmd/prog/script en niet het pid :? of ben ik nou raar? ik ben raar |:( t moet $? zijn wat ik bedoel

ff een wat uitgebreider voorbeeld geknutseld B) :)
code:
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
27
28
29
30
31
#!/bin/bash

URL='http://www.google.com/index.html'
LOG='/tmp/install.log'

# get file zonder alle overbodige directory stuctuur
# die wget normaal maakt (-nH = no host dir -nd no other dirs)
# file komt in huidige dir terecht
# en wordt door wget gerenamed als
# er al een file bestaat met dezelfde naame

wget -nH -nd ${URL}

# bewaar de return code van wget 0 = OK, 1 = NIET OK
RC=$?

# log status van de download
case $RC in
        0)
        echo "download van ${URL} OK" >> ${LOG}
        ;;

        1)
        echo "download van ${URL} fout gegaan" >> ${LOG}
        ;;

# catch all voor als de return code geen 0 of 1 is
        *)
        echo "D'r ging iets fout met wget maar ik( ${0} )weet niet wat" >> ${LOG}
        ;;
esac

[ Voor 68% gewijzigd door Verwijderd op 05-05-2004 15:11 . Reden: extra voorbeeld gemaakt ]


Verwijderd

Topicstarter
Spider.007 schreef op 05 mei 2004 @ 14:08:
wget geeft standaard toch ook de voortgang al aan? Waarom pipe je die momenteel naar install.log toe? Wil je het daar opslaan?
Ja maar ik wil hem een beetje overzichtelijk houden!

Verwijderd

Topicstarter
Bedankt voor de moeite!

Inmiddels gebruik ik deze functie:

code:
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
27
28
29
30
31
function download_indien_nietbestaat
    {
        
        
        rm $1
        if [ -e "$1" ] ; then
        
            echo "- Download van $3 Versie $4"
            
        else
            echo "- Download van $3 Versie $4   "
            echo -n "Voortgang: ";
            
            wget $2 2> /dev/null &
            
            PID=$!
            INTERVAL=0,4
            while :; do
                if [ -d /proc/${PID} ]; then
                        echo -n -E  "#"
                    else
                        echo " Done!"
                        break
                fi

                    sleep ${INTERVAL}
            done
            
        fi
    
    }

Verwijderd

ipv 2> /dev/null kan je ook -q als optie meegeven aan wget, dan houdt ie altijd z'n mond (ook bij fouten), scheelt weer wat tekens in je script en waarom output weggooien als je geen output gratis kan krijgen, toch?

Verwijderd

Topicstarter
Hoe kan ik zorgen dat ./configure zijn mond houd???

Verwijderd

Topicstarter
Verwijderd schreef op 05 mei 2004 @ 14:23:
als je de voortgang van wget zelf wilt weergeven, dat wordt ernstig lastig (je moet dan de output van wget gaan parsen, gaan forken, en dan nog communicatie tussen wget en je script opzetten),
zie boven

maar je kan wget 't zelf laten doen, das veel makkelijker, en als je errors en dergelijke wilt opvangen voor in je install.log , kijk je naar de exit code van wget en zet je zelf iets in je log
bijv onderstaand commando direct na de regel met wget erin
code:
1
echo "wget returned with exit code $?" >> /tmp/install.log


kijk ook eens naar de --progress optie van wget, daarmee kan je de progress indicator veranderen naar eigen smaak

@r3boot $! is toch de exit code van je voorgaande cmd/prog/script en niet het pid :? of ben ik nou raar? ik ben raar |:( t moet $? zijn wat ik bedoel

ff een wat uitgebreider voorbeeld geknutseld B) :)
code:
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
27
28
29
30
31
#!/bin/bash

URL='http://www.google.com/index.html'
LOG='/tmp/install.log'

# get file zonder alle overbodige directory stuctuur
# die wget normaal maakt (-nH = no host dir -nd no other dirs)
# file komt in huidige dir terecht
# en wordt door wget gerenamed als
# er al een file bestaat met dezelfde naame

wget -nH -nd ${URL}

# bewaar de return code van wget 0 = OK, 1 = NIET OK
RC=$?

# log status van de download
case $RC in
        0)
        echo "download van ${URL} OK" >> ${LOG}
        ;;

        1)
        echo "download van ${URL} fout gegaan" >> ${LOG}
        ;;

# catch all voor als de return code geen 0 of 1 is
        *)
        echo "D'r ging iets fout met wget maar ik( ${0} )weet niet wat" >> ${LOG}
        ;;
esac
Zeer handig dit :) Thanks, was ik ook naar op zoek!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 05 mei 2004 @ 16:20:
Hoe kan ik zorgen dat ./configure zijn mond houd???
code:
1
2
$ ./configure --help | grep quiet
  -q, --quiet, --silent   do not print `checking...' messages

Of je stuurt ook stdout & stderr naar /dev/null.

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

overigens is het "tee" commando ook erg handig als je de output wil zien maar ook wil loggen

Verwijderd

Hier mijn voorzetje:
code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash

function twirling_baton () {
    local STATE=0
    local SLEEP=$1
    echo -en "|"
    shift
    "$@" &
    while  [ -d /proc/$! ]; do
        if [ $STATE -eq 0 ]; then
            echo -en "\b/"
        elif [ $STATE -eq 1 ]; then
            echo -en "\b-"
        elif [ $STATE -eq 2 ]; then
            echo -en "\b\\"
        elif [ $STATE -eq 3 ]; then
            echo -en "\b|"
        fi
        STATE=$((($STATE + 1) % 4))
        sleep $SLEEP
    done
    echo -en "\b \b"
    wait $!
}

#
# Voorbeeld van gebruik:
#

function countdown () {
    local T
    for (( T=$1 ; T > 0 ; --T )) ; do : ; done
}

echo -n "Testing: "
twirling_baton 0.1 countdown 100000
if [ $? -eq 0 ]; then
    echo "ok."
else
    echo "error."
fi
exit $?


Dit is dus zo'n "mooie \|/-", ook wel "twirling baton" genoemd. Ik vang ook de status van het in de achtergrond uitgevoerde programma op (met wait), dat lijkt me wel handig.

[ Voor 41% gewijzigd door Verwijderd op 05-05-2004 19:57 . Reden: wat mooier algoritme ]


Verwijderd

Topicstarter
Cool, :)

Deze kan ik mooi gebruikern voor make en make install ;)

snap hem niet helemaal, als ik deze commando wil doen:

wget http://www.colinks.net/download/100mb.bin


Hoe wordt je script dan?

|:( Ik weet hem al :)Spider.007 in "[BASH-Scripting] Voortgang"

Als ik twirling_baton 1 ./configure $configureparms 2>&1 > /tmp/install.log gebruik zie ik dus geen foutmeldingen meer op het scherm, maar ik zie de twirling baton ook niet meer!

Hoe los ik da op?

[ Voor 98% gewijzigd door Verwijderd op 06-05-2004 10:42 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Door proberen de output van de ene wel te redirecten, en van de andere niet? Maar we verwachten hier in NOS dat je ook zelf wat probeert, en niet bij elk probleempje hier komt vragen "wat moet nu doen", het is hier geen helpdesk, lees voor de grap ook de policy eens, die ik je al 5x heb aangeraden inmiddels.
Pagina: 1

Dit topic is gesloten.