ppp Verbindung per Script abfragen.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

ppp Verbindung per Script abfragen.

Beitrag von knecht » 29.04.2004 17:13:43

Debian Sarge, Kernel 2.4.22
Bin leider gar kein Meister was Scripte angeht, habe folgendes Anliegen:
Mein Server ist über T-DSL eingewählt, und ich bräuchte jetzt ein Script, das per Crontab alle 30 min schaut ob er noch Online ist, und wenn nicht sich neu einwählt.
Wie befrage ich den Rechner ob er online ist und lass ihn wenn nicht wieder einwählen.

Vielen Dank
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 29.04.2004 17:40:54

Viele (extrem viele ;-)) Wege führen hier nach Rom...

z.B.: Alle halbe Stunde ein Ping (nur ein Paket (ObQuote: "Geben Sie mir *ein* Ping!")) an einen Server im Internet abfeuern. Wenn das nicht zurückkommt, ist die Leitung wahrscheinlich weg.

z.B.: Die Ausgabe von ifconfig überprüfen, ob das Device ppp0 noch existiert. Wenn nein, ist die Leitung tot. Das funktioniert aber nur, wenn die Leitung sich nicht aufgehängt hat (sprich: ist noch verbunden, überträgt aber keine Daten mehr).

Eine Kombination aus den Methoden könnte auch sinnvoll sein: Erst ifconfig checken. Wenn ppp0 fehlt, ist die leitung eh hin: Redial. Wenn ppp0 da ist: Einmal pingen. Wenn das nicht geht: auflegen, redial.

Alles nur beispielhaft.

Übrigens kann man pppd auch so einstellen, dass er sich von selbst wieder einwählt, wenn die Verbindung wegfällt. Das sollte die sauberste Lösung sein...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 29.04.2004 18:06:22

für pdreker:
sorry für das doppelte post, ich dachte nur es wäre besser unter internetrouter untergebracht, und bevor ich den thread löschen konnte waren die antworten schon da. kommt nicht mehr vor
Übrigens kann man pppd auch so einstellen, dass er sich von selbst wieder einwählt
hab ich eigendlich gemacht, wenn er sich beendet habe ich ein script in /etc/ip-up.d/ gelegt, das 5 sekunden später wieder reingeht. trotzdem ist es in 3 Monaten 4 mal vorgekommen das keine verbindung da war :roll:

Wie frage ich genau ab damit ich eine verwertbare true/false Antwort bekomme.
(hab sowas noch nie gemacht)
Eine Kombination aus den Methoden könnte auch sinnvoll sein: Erst ifconfig checken. Wenn ppp0 fehlt, ist die leitung eh hin: Redial. Wenn ppp0 da ist: Einmal pingen. Wenn das nicht geht: auflegen, redial.
ca. so habe ich das gedacht, aber wie machen ?
ifconfig | grep ppp ?
wie kann ich dann eine Entscheidung machen ?

Mit der Bitte um ein Beispiel
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 29.04.2004 18:15:20

Es gibt da irgendwo bei pppd eine explizite Option, dass er sich bei Verbindungsverlusst immer wieder einwählen soll. Kein externes Skript oder so nötig. Wenn man die Retry Begrenzung abschaltet, versucht er es so lange, bis er wieder drin ist...

Code: Alles auswählen

# Terminate after n consecutive failed connection attempts.
# A value of 0 means no limit. The default value is 10.
maxfail 0
# Do not exit after a connection is terminated; instead try to reopen
# the connection.
persist
Das sollte eigentlich dafür sorgen, dass der pppd extrem hartnäckig versucht die Verbindung wieder aufzubauen...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 29.04.2004 19:42:00

habe das ganze in /etc/ppp/options geändert, wenn es das tut was es soll ist das wirklich eine Super Sache . . .
Do not exit after a connection is terminated; instead try to reopen
# the connection.
wenn ich das richtig interpretiere dann bleibt das Interface auch immer auf ppp0, oder ?
(wegen firewallscript und trafficshaping die ja immer auf ppp0 gehen)



Vielen Dank :lol:
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 29.04.2004 22:46:46

@pdreker:

Soweit die Theorie ;-) In der Praxis ist es leider so, daß sich dr pppd durch das Zwangsdisconnect manchmal wegfliegt. Dies scheint allgemein bekanntes Problem zu sein (der Anzahl von diesbezüglichen Treffern bei Google nach urteilen) und es scheint leider noch keine saubere Lösung zu geben. Und wenn der pppd weg ist, dann nützt auch die Option nichts mehr.

Hier war vor wenigen Tagen ein entsprechnder Post im Forum, wo das jemand per inittab und respawn gemacht hat. Werde es mir bei Gelegenheit auch mal raussuchen und ausprobieren (dann brauch in in meiner Abwesenheit nicht meinen Sohn per Telefon zu einem 'Affengriff' am Router bewegen um an meine Mails zu kommen). Vielleicht schreib ich das ja dann mal ins Wiki.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mistersixt » 30.04.2004 00:24:57

Oder bau ein kleines Script, das per crontab jede Minute gestartet wird und überprüft, ob es noch ein ppp Device gibt:

Code: Alles auswählen

darkstar:~# STATUS=`cat /proc/net/dev | grep ppp0`
darkstar:~# if [ "${STATUS}" = "" ]; then echo "down"; else echo "up"; fi
up
darkstar:~# 
Dann könnte man es - falls es nicht mehr läuft - nachstarten.

Gruss, mistersixt.

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 30.04.2004 20:52:16

Eine gute Sache ! Wegen dem Script eine Frage

Code: Alles auswählen

 STATUS=`cat /proc/net/dev | grep ppp0`
if [ "${STATUS}" = "" ]
 then
 	echo "pppd ist down" >> /shared/ppperror.log
	date >> /shared/ppperror.log
	echo "starte Interface pppd neu" >> /shared/ppperror.log
	/etc/init.d/ppp start >> /shared/ppperror.log
	sleep 1
	pon
	sleep 2
	STATUS=`cat /proc/net/dev | grep ppp0`

	if ["${STATUS}"=""]
	 then
		echo "starten von pppd nicht möglich"  >> /shared/ppperror.log
	 else
	 	echo "starten von pppd erfolgreich" >> /shared/ppperror.log
	fi

	echo "" >> /shared/ppperror.log
 else
 fi
Das hab ich mir mal daraus gebastelt, das es so nicht läuft weiß ich selbst, nur meine Frage ist wie ich zwei if Routinen ineinander Schachteln kann.
Aus früheren Basic Zeiten schimmert noch grob eine Vorstellung von elseif, wie geht das unter Linux.
Gilt das fi als Beendigung der if Routine oder als Ende des ganzen Scriptes ?
Und wie kann ich eine Ausgabe in einer Datei hintereinander in eine Zeile einfügen ?

Einmal hat er den Zwangsdisconnect schon Problemlos mit persist in der /etc/ppp/options überwunden. Nur zur Info

Vielen Dank
Sebastian :)
Zuletzt geändert von knecht am 30.04.2004 21:08:56, insgesamt 1-mal geändert.
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.04.2004 21:06:09

knecht hat geschrieben:Gilt das fi als Beendigung der if Routine oder als Ende des ganzen Scriptes ?Und wie kann ich eine Ausgabe in einer Datei hintereinander in eine Zeile einfügen ?
"fi" ist natürlich ein "endif", sonst hieße es ja anders (komischerweise ist das ende von "for" "done" und nicht "rof" ;). Verschachteln geht ganz normal

Code: Alles auswählen

if ...; then
  if yyy; then
     echo bla;
  fi
  echo blubb
fi
Ausgaben aneinanderhängen geht einfach mit ">>"

Code: Alles auswählen

echo Hallo > /tmp/test #Erstellen/Überschreiben
echo Welt >> /tmp/test #Anhängen

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 30.04.2004 22:41:33

Mein Script sieht jetzt so aus:

Code: Alles auswählen

#Schauen ob das Interface noch da ist
STATUS=`cat /proc/net/dev | grep ppp0`
if [ "${STATUS}" = "" ]
then
	date >> /shared/ppperror.log
 	echo "Error: pppd ist inaktiv" >> /shared/ppperror.log
	echo -n "Versuche neustart von pppd . . . " >> /shared/ppperror.log
	/etc/init.d/ppp start
	sleep 1
	STATUS=`cat /proc/net/dev | grep ppp0`
 if [ "${STATUS}" = "" ]
 then
	echo "fehlgeschlagen"  >> /shared/ppperror.log
 else
 	echo "erfolgreich" >> /shared/ppperror.log
 fi
#Verbindung überprüfen
sleep 8
 echo -n "Verbindung testen . . . " >> /shared/ppperror.log
 ping -c 1 194.25.2.129  > /dev/null
      if [ $? -eq 0 ]
      then
         echo "erfolgreich" >> /shared/ppperror.log
      else
         echo "fehlgeschlagen" >> /shared/ppperror.log
      fi
	echo "" >> /shared/ppperror.log
 fi
Den Teil Verbindung prüfen habe ich aus folgendem Topic
http://www.debianforum.de/forum/viewtop ... +else+ping
das script funktioniert aber ich habe folgende Verständnissfrage:

Code: Alles auswählen

ping -c 1 194.25.2.129  > /dev/null
      if [ $? -eq 0 ]
Ich verstehe diese Abfrage nicht, einen Ping machen, ins nichts schicken und was bedeutet dann die if abfrage genau.

Danke
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mistersixt » 01.05.2004 00:54:21

$? ist das Ergebnis des vorangegangenen Befehls. Steht da eine 0 drin, war der Befehl erfolgreich. Steht da was anderes drin (eine 1 zum Beispiel), ist der vorangegangene Befehl mit einem Fehler geendet.

Sprich: Du setzt einen einzigen ping ab (-c 1), wenn Du ein Reply bekommst - also das Internet "offen" ist - , dann steht in $? eine 0, sonst <> 0 !

Gruss, mistersixt.

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 02.05.2004 09:05:30

OK, eine feine Funktion, vielen Dank . . .

Also bis jetzt mußte das Script noch nicht einspringen, pppd und persist funktioniert bei mir jetzt schon 2 Tage ohne die an anderen Stellen im Forum beschriebenen Probleme.

Debian Sarge, und DSL bei Telekom


Vielen Dank euch allen für die Hilfe
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
smoon
Beiträge: 248
Registriert: 07.05.2004 15:44:57
Kontaktdaten:

Beitrag von smoon » 07.05.2004 18:12:17

Code: Alles auswählen

*/10 * * * * if ! test `ps acx | grep pppd | grep -v grep | cut -c0-6` ; then /etc/init.d/ppp restart > /dev/null ; fi
in der crontab tuts bei mir ganz gut ;)

lobo
Beiträge: 180
Registriert: 27.01.2002 21:48:08
Lizenz eigener Beiträge: GNU General Public License

Beitrag von lobo » 08.05.2004 14:40:01

Ich hab das bei mir etwas komisch gelöst, aber es funktioniert und ist einfach ;-)

Auf meinem Router liegt das Shellscript /etc/ppp/ip-down.d/do_up
mit folgendem Inhalt:

Code: Alles auswählen

#!/bin/sh
pon dsl-provider
Sobald die Verbindung getrennt wird, wird durch "pon dsl-provider" die Neueinwahl veranlasst.


Gruss

Jochen

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 08.05.2004 17:34:24

Hatte ich auch mal so, aber ich hab die Erfahrung gemacht das es ratsam ist ein sleep 3 vor pon einzubauen einzubauen. (manche Provider sind da ein bißchen eigen)
Trozdem war manchmal die Verbindung nicht da, und ich mußte sie von Hand starten.
Aber mit persist mode des pppd und dem Script oben geht es jetzt wunderbar.
(auch wenn mir bis jetzt schon ein mal der pppd prozess wegen persist gestorben ist, aber das Script hat es aufgefangen)

gruß
Sebastian
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Benutzeravatar
Raoul
Beiträge: 1435
Registriert: 20.05.2003 00:16:35
Lizenz eigener Beiträge: neue BSD Lizenz
Kontaktdaten:

Beitrag von Raoul » 26.05.2004 01:08:11

Noch ein anderer Ansatz: Gucken, ob es eine pid Datei (für die Verbindung, nicht für den pppd!) gibt. Das sagt zwar nicht wirklich was darüber aus, ob die Verbindung auch Pakete übertragen kann, aber mit ich fahre mit folgendem seit Monaten fehlerfrei:

Code: Alles auswählen

#!/bin/sh
 
while true
do
test -f /var/run/dsl-provider.pid || pon dsl-provider
sleep 15
 
done
Wird einmalig beim Systemstart gestartet bzw. läßt sich über die init ein und ausschalten.

Raoul

Code: Alles auswählen

grep -ir fuck /usr/src/linux

Benutzeravatar
knecht
Beiträge: 1214
Registriert: 08.01.2004 15:33:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von knecht » 26.05.2004 13:06:10

Ich hab auch seit Monaten ruhe mit der persist option in der /etc/ppp/options Datei, und einen minütlichen crontab mit dem Script:

Code: Alles auswählen

#!/bin/sh

#Schauen ob das Interface noch da ist
STATUS=`cat /proc/net/dev | grep ppp0`
if [ "${STATUS}" = "" ]
then
        date >> /shared/ppperror.log
        echo "Error: pppd ist inaktiv" >> /shared/ppperror.log
        echo -n "Versuche neustart von pppd . . . " >> /shared/ppperror.log
        /etc/init.d/ppp start
        sleep 1
        STATUS=`cat /proc/net/dev | grep ppp0`
 if [ "${STATUS}" = "" ]
 then
        echo "fehlgeschlagen"  >> /shared/ppperror.log
 else
        echo "erfolgreich" >> /shared/ppperror.log
 fi
#Verbindung überprüfen
sleep 8
 echo -n "Verbindung testen . . . " >> /shared/ppperror.log
 ping -c 1 194.25.2.129  > /dev/null
      if [ $? -eq 0 ]
      then
         echo "erfolgreich" >> /shared/ppperror.log
      else
         echo "fehlgeschlagen" >> /shared/ppperror.log
      fi
        echo "" >> /shared/ppperror.log
 fi
Ich lasse mir halt zur Überwachung das ganze immer in eine Datei protokollieren (>> /shared/ppperror.log), und es gab bei mir mit perist entgegen den Erfahrungen hier im Forum in 3 Monaten nur 2 mal ein Absterben des pppdämons.
_________________________________________________
Linux HowTo's, Programmierung, Wallpapers und 3D:
http://www.neoBerserker.de

Antworten