• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script zur Überprüfung der Onlineverbindung

Yehudi

Guru
Hallo liebe Linuxer,

ich hatte hier aus dem Forum ein Script kopiert. Dieses meinen Bedürfnissen umgeschrieben, nur funktioniert es nicht.
Es wird über einen Cronjob angesteuert, und das alle 5 Minuten, um zu überprüfen, ob die Verbindung zum Internet steht. Bricht der Provider die Verbindung ab, so wird sie allerspätestens nach 5 Minuten wieder aufgebaut.
Der Crownjob erledigt seine Arbeit. Nach 5 Minuten wird einmal kurz eine Datei Namens "on.log" geschrieben, und wieder gelöscht.
Starte ich das Script ohne Cronjob, passiert genau das gleiche, ist die Internetverbindung unterbrochen, dann wird sie nicht wieder hergestellt.
Muss an dem Script noch etwas anderes angepasst werden?

Code:
#!/bin/sh
#######################################################
# VARIABLEN
#######################################################

datei=/home/yehudi/log/internetstatus.log
logdat=/home/yehudi/log/on.log
host=www.hansenet.de
count=3

#######################################################
# Wieder online pingen
#######################################################

ping -c $count $host | grep ttl > $logdat
if [ -s $logdat ]; then
  echo "Wir sind online"
 else
  echo `date -R` Neueinwahl >> $datei
  cinternet -i dsl0 -H
  cinternet -i dsl0 -O
  sleep 30
  cinternet -i dsl0 -A
  cinternet -i dsl0 -D
  cinternet -i dsl0 -s
  cinternet -i dsl0 -l
  echo `date -R` Eingewählt >> $datei
fi
chown yehudi $datei
chgrp users $datei
rm $logdat
exit
 

regexer

Advanced Hacker
Inwiefern funktioniert das Script nicht? Irgendwelche Fehlermeldungen? Was für Einträge findest du in der Datei /home/yehudi/log/internetstatus.log?

Außerdem ist das script an mehreren Stellen unglücklich programmiert, was auch zu Fehlern führen könnte.
1. Zumindest unter Suse 8 kann ein "ping -c 3" ewig dauern, weil sich dieser Befehl erst nach 3 erfolgreich übertragenen Paketen beendet. Ist also dein host nicht erreichbar, wird das Script nie zum Wählen kommen. Besser ist, man gibt zum ping zusätzlich einen Timeout-Parameter an (Parameter -w)
2. Auch der grep auf ttl ist unglücklich. Was ist, wenn diese Kombination im Hostnamen vorkommt? Besser ist, man frägt auf den Returncode ($?) ab. Ist dieser 1, dann wähle. Ist dieser größer 1, dann besteht sogar noch ein anderes Problem (unknown host etc.)
3. Den "echo wir sind online" sollte man in einem Cronscript in eine Datei umleiten oder ganz streichen. Du kriegst sonst nämlich alle 5 Minuten eine Mail.
4. Ich bin mir nicht sicher, was "cinternet" ist. Wählt man damit? Mei meinem DSL-Router genügt ein einfacher ping...
 
OP
Y

Yehudi

Guru
Oh, das ist ja eine für mich sehr interessante Aussage. Wie oben beschrieben habe ich das Script kopiert, ich kann es zum Teil verstehen, und abändern. Selber bin ich momentan dazu nicht in der Lage.
In dem anderen Tread, aus dem ich das kopiert hatte, habe ich schon wegen der beiden Log Dateien nachgefragt, aber keine Antworten erhalten.
Das Script macht keine Fehlermeldung, und produziert nur kurzfristig die eine on.log Datei.
In der anderen Datei internetstatus.log steht nichts weiter drin.

1. da steht doch ein
Code:
 ping -C $count $host | grep ttl > $logdat
und nicht
Code:
ping -c 3
glücklicher weise nutze ich Suse 9.2

Wenn ich Dich recht verstehe, würdest Du diese Zeile so ändern:

Code:
ping -w3 $count $host | grep ttl > $logdat
2. Bei dem bin ich leider sehr unsicher, was Du meinst. Ich verstehe, das so:

Code:
ping -w3 $count $host | grep $1 > $logdat

3. Also die Zeile völlig löschen, um sich nicht selber zu bespamen.
Oder gehören "then" und "else" auch noch mit dazu.
4. "cinternet" ist die Funktion von "kinternet" über die Konsole.

Danke, das Du das so genau erläuterst.
 
A

Anonymous

Gast
Hi,
da Dein Script manuell funktioniert, wird es wohl eher an den Rechten bzw env liegen !!!
also in der Cron sollte
*/5 * * * * sudo /deinscript
stehen und das cinternet solltest Du mit Pfad angeben, da nicht sichergestellt ist das wenns über die cron ausgefuehrt wird, das es im pfad ist !
Ein wait im ping kann nicht schaden und auch den Host den Du pings solltest Du überdenken weil wenn der DNS ausfaellt resetet er das netz dann auch obwohlst Du ohnehin online waerst !
Besser du Pingst Dein gw oder einen hop spaeter ;-)

Mƒg ®êïñï
 

regexer

Advanced Hacker
Yehudi schrieb:
1. da steht doch ein
Code:
 ping -C $count $host | grep ttl > $logdat
und nicht
Code:
ping -c 3
Nö! Ich lese ein kleines c und außerdem gibt es bei mir keine Option mit großem C.

Ich würde den ping so auswerten:
Code:
/bin/ping -c $count -w 20 $host > /dev/null 2>&1  # eventuell 20 als Varialbe
retc=$?
if [ $retc -eq 0 ]   # ping hat Kontakt
then
  echo "Wir sind online" >> $datei    # Umleitung, da sonst mail
elif [ $retc -eq 1 ]             # ping hat keinen Kontakt
then
  echo `date -R` Neueinwahl >> $datei 
  cinternet -i dsl0 -H 
  cinternet -i dsl0 -O 
  sleep 30 
  cinternet -i dsl0 -A 
  cinternet -i dsl0 -D 
  cinternet -i dsl0 -s 
  cinternet -i dsl0 -l 
  echo `date -R` Eingewählt >> $datei 
else   # ping hat harten Fehler 
  echo "Konnte ping nicht ausführen. Fehler $retc!" >> $datei
fi 
# das rm logdatei kann man sich sparen, da man keine schreibt
Eventuell musst du den Returncode 2 (=unknown host) auch noch abfangen. Dann würde die Zeile mit dem elif folgendermaßen aussehen:
Code:
elif [ $retc -eq 1 -o $retc -eq 2 ]
Außerdem sollte man auf ähnliche weise die Returncodes von cinternet abfragen. Vielleicht kann da auch ein Fehler passieren...
 
OP
Y

Yehudi

Guru
@reini123:
Was den Cronejob angeht ist das alles in Ordnung, da wenn ich irgend ein Shellscript/programm mit Rechten darüber ausführe funktioniert es auch.
Deine Überlegung Online zu sein, und die Url ist nicht erreichbar scheint mir gar nicht so abwegig.
Was Du allerdings mit GW meinst ist mir nicht klar.
Mir würde dazu dann einfallen, verschiedene Url's anzupingen. Also wenn die 1 nicht erreichtbar ist, dann die 2 und sonst die 3.

@notoxp:
Ich meinte natürlich auch ein kleines c und die 3. Dann werde ich das wenn ich morgen zu Hause bin, das gleich ausprobieren. Danke Dir schon mal, für Deine Mühe.

Bin ausserhäsig am Surfen.
 
A

Anonymous

Gast
Hi,
GW = Gateway ;-)
Url sind schlecht weil sie über den DomainNameServer kurz DNS erst aufgelöst werden und wenn Du 17 URL anpings kanns trotzdem sein das Du keine erreichst weil Dein DNS ausgefallen ist!
Fazit: Immer IP´s anpingen.

Step 2:
Rechte usw.
Beispiel: Du bist zb User Karli und machst `su root` dann `env > /env1`, dann steigst als root wieder aus so das Du Karli bist und machst `su - root` und `env > /env2`.
Wenn Du jetzt Deine Envirement env1 und env2 vergleichst wirst Du Markante Unterschiede feststellen, vorallen im Pfad.
Und das ist der Grund warum cinternet wahrscheinlich nicht von der crontab gefunden wird !
Zweifellos gehen viele scripte tadellos aber sicher nicht solche wo noetige Pfade nicht gesetzt sind ;-)
Also mit `locate cinternet` oder `type cinternet` solltest sehen wo das steht ( zb /sbin/cinternet ) und es auch so im Script aufrufen ;-)

Mƒg ®êïñï
 
OP
Y

Yehudi

Guru
@notoxp

Das Script funktioniert. Ganz, ganz doll danke. Vor allen Dingen, weil Du nicht nur das Script korrigiert hast, sondern weil Du auch die Fehler darin erklärt hast. Das ist sehr viel wert. So bin ich ich in meinem Linuxverständnis deutlich gewachsen.
Ganz bestimmt ist dieser Treat auch für andere eine Hilfe.
Einen schönen Tag Euch beiden noch.

Lösung ist hier erfolgreich vermittelt worden
 
OP
Y

Yehudi

Guru
Hier noch eine Ergänzung für Einsteiger:
Also Du musst eine Textdatei mit Kwrite erstellen. In diese kopierst Du den Text des Scriptes rein. Die Korektur auf dem Script beginnt erst in der Zeile, wo notoxp es aufschreibt. Die Zeilen vorher dürfen nicht fehlen. Die musst Du allerdings für Dich anpassen. In Deinem Homeverzeichnis gibt es z.B. kein yehudi, und Du bist auch nicht bei Hansenet.
Diese Datei nennst Du um in "online.sh" und schaltest Sie in einen ausführbaren Modus in dem Du mit der rechten Maustaste auf Eigenschaften gehst, und unter dem Reiter Berechtigung machst Du bei Ausführbar ein Kreuz.
Wer das ganze mit einem Cronjob verbinden möchte schaue unter:

a.wie Kcrown installiert wird:
http://www.linux-club.de/viewtopic.php?t=23814
b.Der CrownJob wird nicht ausgeführt:
http://www.linux-club.de/viewtopic.php?p=128404#128404
 
Oben