Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Einstiegsfragen Shell Skripte

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
canahan
Newbie
Newbie
Beiträge: 3
Registriert: 17. Okt 2004, 14:44

Einstiegsfragen Shell Skripte

Beitrag von canahan »

Hallo zusammen,

da ich programiertechnisch Laie bin und nun meine ersten zaghaften Versuche auf der Shell unternehme, wollte ich mal fragen ob ich generell auf dem richtigen weg bin :). Ich hab hier ein kleines Skript zum ablgleich mit ein paar ntp server geschrieben. Funktioniert soweit auch, nur würde mich interessieren wie man sowas sauberer schreiben könnte. Vielleicht hat jemand nerv sich das mal anzutun :)

Code: Alles auswählen

/usr/sbin/ntpdate -u time.uni-freiburg.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (1Freiburg)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
 exit 0
fi
/usr/sbin/ntpdate -u ntp0.fau.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (2Frauenhofer)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
/usr/sbin/ntpdate -u ntps1-0.cs.tu-berlin.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (3Berlin)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
/usr/sbin/ntpdate -u ptbtime1.ptb.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (4ptbtime1)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
 echo "Leider war keiner der Timeserver verfuegbar"
 echo "Die Systemzeit konnte nicht gesetzt werden !!!"
 logger TIME: Keine externe Zeitserver verfuegbar
 logger TIME: Die Systemzeit konnte nicht gesetzt werden
exit 1
fi
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

Was mich persönlich an so einem Stil stört:

1/ viele gleiche Strukturen --> mach eine Funktion draus

2/ viele gleiche Exits -> das führt schnell zu verwirrungen, versuche das erfolgreiche Beenden eines Scripts an einer stelle zubündeln

3/ Variablen :) alles was irgendwie konfigurierbar ist, rausziehen (hier z.B. die Liste der NTPServer, das macht das Script wartungsfreundlicher

4/ einen kleinen Root-Check. Das Scritp setzt root Rechte vorraus, hier ist ein kleiner Check nett um nicht auf andere Fehler zu laufen

aber an sich liest sich das Dingen gut, ich würde das spontan (ohne Test und doppelten Boden, d.h. mit potentiellen Fehlern und ohne garantie auf 'besseren' code) so ändern, den ganzen success kram könnte man weglassen, da ja alle infos im logfile auftauchen

Code: Alles auswählen

#!/bin/bash

NTPSERVERS="time.uni-freiburg.de ntp0.fau.de ntps1-0.cs.tu-berlin.de"
SUCCESS=0

if [ ! `id -u` = 0 ]
then
  echo "you must be root :)"
  exit 1
fi 

# function:
ntpsync() {
  SERVER=$1
  /usr/sbin/ntpdate -u $SERVER > /dev/null 2>&1
  if [ $? = 0 ]
  then
     /sbin/hwclock --systohc
     return 0 
  fi
  return 1
}


# main loop
for NTPS in $NTPSERVERS
do
   ntpsync $NTPS
   if [  $? = 0 ]
   then
     echo "Die Systemzeit wurde erfolgreich gesetzt ($NTPS)"
     logger TIME: Die Systemzeit wurde erfolgreich gesetzt
     SUCCESS=1
     break
   else 
     logger "TIME: Server $NTPS nicht verfügbar"
   fi
done

if [ $SUCCESS = 0 ]
then
 echo "Leider war keiner der Timeserver verfuegbar"
 echo "Die Systemzeit konnte nicht gesetzt werden !!!"
 logger TIME: Keine externe Zeitserver verfuegbar
 logger TIME: Die Systemzeit konnte nicht gesetzt werden
 exit 1
fi 
die NTP-Server würde ich dann sinnvollerweise auslagern, extern speichern oder übergeben, dann ist das noch wartungsfreundlicher
canahan
Newbie
Newbie
Beiträge: 3
Registriert: 17. Okt 2004, 14:44

Beitrag von canahan »

Vielen Dank für die Antwort. Werde mich heute abend mal hinsetzen und versuchen es in deinem Stil neu aufzusetzen. Kam mir von Anfang an komisch vor das sich gleiche Teile ständig wiederholen.

Für weitere Vorschläge bin ich dankbar :)
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

Weitere Vorschläge von meiner Seite sind:
1) Anhand der Systemvarialbe $? prüfen, ob der Befehl "hwclock" richtig ausgeführt wurde.
2) Falls das Skript noch sicherer gemacht werden soll:
a) Anhand $? prüfen, ob der Befehler "logger" richtig ausgeführt wurde.
b) mit dem Systemkommando "trap" verschiedenste Signale abhandeln. Wass soll z.B. passieren, wenn das Script während der Ausführung Signal 2 bekommt (Entspricht Strg+C)?
Antworten