[bash] Commando blijven uitvoeren totdat exit-waarde = 0

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik ben bezig een backup-scriptje te schrijven voor mijn website, waarbij ik iedere nacht met een cronjob automatisch een nieuwe backup maak.

Omdat de ftp-server van mijn host om onverklaarbare redenen nogal in de stress schiet van al dat geupdate, wil ik mijn script zo maken dat het blijft doorgaan totdat het gelukt is.

Ik heb begrepen dat je in bash de exit-waarde van het laatste commando kan opvragen met $?. Hier probeer ik in een while-loopje gebruik van te maken.

Bash:
1
2
3
4
5
6
7
8
9
10
11
# retrieve update
echo Retrieving update...
ncftpget -f config/ftp-config -R /home/backup/ /www/routes/

# if it didn't work out,
# keep going on until it does
while [ $? -eq 0 ]
do
        echo Something failed, retrying...
        ncftpget -f config/ftp-config -R /home/backup/ /www/routes/
done


Het probleem met deze code is dat de loop zich oneindig blijft herhalen, ook wanneer ncftpget met een exit-waarde van 0 terugkeert. Wat doe ik fout?

Ik ontken het bestaan van IE.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hmmm, ik ben niet zo bekend met "bash scripting" maar (stom idee hoor) probeer eens:
code:
1
2
3
while [ $? -eq '0' ]
of...
while [ $? -eq "0" ]

ofzo?

[ Voor 10% gewijzigd door RobIII op 04-09-2006 17:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Dat was ik vergeten erbij te zetten, heb ik al geprobeerd. Als ik quotes om de 0 heenzet, wordt de loop nooit uitgevoerd, ook al geeft het vorige commando een fout terug.

Quotes om de $? heen maakt hierbij geen enkel verschil.

Ik ontken het bestaan van IE.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Bash hoort niet hier maar in Non-Windows Operating Systems. Zie ook Waar hoort mijn topic?. :)

PRG>>NOS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

code:
1
2
3
4
5
X=1
while [ ${X} != 0 ]; do
    some_command
    X=${?}
done

  • Tepel
  • Registratie: Juni 2006
  • Laatst online: 25-12-2025
wat reboot zegt,

exit status == 0 -> alles ok
exit status != 0 -> iets is fout

dus wat jij deed was, zolang ncftp geen fout geeft voer ik hem nog een keer uit.
dus de korte oplossing is:

code:
1
2
3
4
5
6
7
8
9
10
11
# retrieve update
echo Retrieving update...
ncftpget -f config/ftp-config -R /home/backup/ /www/routes/

# if it didn't work out,
# keep going on until it does
while [ $? != 0 ]
do
        echo Something failed, retrying...
        ncftpget -f config/ftp-config -R /home/backup/ /www/routes/
done


dit zou in principe moeten werken, het is misschien handig om te exit waarde gelijk op te slaan na het ncftp command voor het geval je nog wat andere dingen wilt doen.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# retrieve update
echo Retrieving update...

# minstens 1x draaien
EXIT=1
while [ $EXIT != 0 ]
do
        echo "Running ncftp"
        ncftpget -f config/ftp-config -R /home/backup/ /www/routes/
        EXIT=$?
        if [ $EXIT != 0 ]
        then
                echo "Running again"
        fi
done

[ Voor 4% gewijzigd door Tepel op 04-09-2006 17:48 ]

0x7F


  • devzero642
  • Registratie: November 2003
  • Niet online
Ik gebruik voor dat soort exit waardes altijd "-ne" ipv "!=" als test-operator, want je weet toch al dat het altijd een integer is.

[ Voor 3% gewijzigd door devzero642 op 04-09-2006 19:41 ]

Pagina: 1