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

Script zur Überprüfung der Onlineverbindung

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

Moderator: Moderatoren

Antworten
Yehudi
Guru
Guru
Beiträge: 2152
Registriert: 21. Jan 2004, 13:51
Wohnort: Hamburg
Kontaktdaten:

Script zur Überprüfung der Onlineverbindung

Beitrag von Yehudi »

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: Alles auswählen

#!/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
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

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...
Yehudi
Guru
Guru
Beiträge: 2152
Registriert: 21. Jan 2004, 13:51
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Yehudi »

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: Alles auswählen

 ping -C $count $host | grep ttl > $logdat
und nicht

Code: Alles auswählen

ping -c 3
glücklicher weise nutze ich Suse 9.2

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

Code: Alles auswählen

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

Code: Alles auswählen

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.
reini123

Beitrag von reini123 »

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 ®êïñï
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

Yehudi hat geschrieben:1. da steht doch ein

Code: Alles auswählen

 ping -C $count $host | grep ttl > $logdat
und nicht

Code: Alles auswählen

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: Alles auswählen

/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: Alles auswählen

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...
Yehudi
Guru
Guru
Beiträge: 2152
Registriert: 21. Jan 2004, 13:51
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Yehudi »

@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.
reini123

Beitrag von reini123 »

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 ®êïñï
Yehudi
Guru
Guru
Beiträge: 2152
Registriert: 21. Jan 2004, 13:51
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Yehudi »

@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
Yehudi
Guru
Guru
Beiträge: 2152
Registriert: 21. Jan 2004, 13:51
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Yehudi »

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
Antworten