ubuntuusers.de

Script zum Pingen

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

ubuntuus3r

Anmeldungsdatum:
13. Januar 2011

Beiträge: Zähle...

Hallo zusammen!

Ich habe folgendes Script im Ordner /etc/NetworkManager/dispatcher.d/ als google_ping.sh angelegt. es soll Google alle 20 Sekunden pingen.

#!/bin/sh

# stop google ping 
kill -9 $( ps aux | grep [p]ing | grep google | awk '{ print $2 }' ) 2>/dev/null

# start google ping
if [[ $2 == 'vpn-up' ]]; then
    # 20 sec interval
    ping -i 20 google.com
fi

Mit "chmod +x google_ping.sh" habe ich es ausführbar gemacht. Das Script soll angeblich jeden Mal automatisch aufgerufen werden, wenn Netzwerk- oder VPN-Verbindung steht und es wird nur pingen wenn VPN-Verbindung steht. Sonst soll nichts passieren, laut Information zum Script.

Ein paar Fragen dazu:

1. Ist es richtig geschrieben?

2. Ich habe es noch nicht hinbekommen, dass es läuft. Was mache ich falsch?

3. Mit ps aux | grep google bekomme ich keine Angabe, dass das Script läuft.

Der Grund, warum ich das Script benötige: Nur wenn regelmäßig Traffic verursacht wird, bricht die Verbindung zum VPN nicht ab. wenn ich, wie hier einen langen Text schreibe und nebenbei kein Ping läuft, bricht die Verbindung nach XX Minuten zum VPN ab, egal zu welchem VPN-Server ich verbunden bin.

Ich hoffe, Ihr könnt mir helfen - evtl. sogar beim Problem mit den Abbrüchen. Vielleicht könnte einer von Euch per Teamviewer und Wireshark da mehr herausfinden, warum die Verbindung abbricht.

Moderiert von barabbas:

Dieses Thema wurde verschoben. Bitte beachte die als Wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“). Danke!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hallo,

was heißt, dein Script läuft nicht?

Was passiert denn, wenn du ./google_ping.sh im betreffenden Ordner zwecks Test aufrufst?

Ist die Datei als ausführbar gesetzt? (chmod a+x google_ping.sh)

zum grep und awk:

....  awk ' /\/etc\/NetworkManager\/dispatcher.d\/google_ping.sh/ { print $2; }'

und die greppel kannzte weglassen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Wohnort: Berlin

man kann ps auch gleich sagen, was man meint, mit

ps opid=, -C google_ping.sh

aber hier braucht man es nicht, weil

killall google_ping.sh

sich selbst die PID raussucht.

In /etc/NetworkManager/dispatcher.d/ die Skripte werden in der Reihenfolge abgearbeitet, die der Zahl entspricht, mit der sie beginnen, soweit ich weiss - ohne Zahl → keine Verarbeitung.

ubuntuus3r

(Themenstarter)

Anmeldungsdatum:
13. Januar 2011

Beiträge: 21

Also, wenn ich zu /etc/NetworkManager/dispatcher.d/ wechsel und dort ./google_ping.sh eingebe, kommt die Meldung "Getötet". Heißt das, dass das Script lief?

Das Script ist als Programm ausführbar und als Benutzer und Gruppe 'root'

@user unknown: Was hat das mit den Zahlen auf sich? Wo soll ich eine Zahl angeben? Ich bin erst seit 2 Wochen mit Ubuntu unterwegs.

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4536

mal blöd gefragt...

das script heist google_ping.sh und tötet als erstes mal alles, was in der Ausgabe von ps aux irgendwo google und ping in der Zeile hat, z.B. ein vor dem Aufruf gestartetes gedit google_ping.sh zur Bearbeitung des Scriptes und auch sich selber, bevor es den if-Block abarbeitet... sicher das das so gewollt und sinnvoll ist?

ubuntuus3r

(Themenstarter)

Anmeldungsdatum:
13. Januar 2011

Beiträge: 21

Ich habe das Script nicht geschrieben, sondern bekommen. Wie gesagt, ich habe erst seit 2 Wochen Ubuntu und kenne mich da gar nicht mit aus und könnte auch nicht so ein Script schrieben. Wenn Ihr also wisst, wie das Script aussehen soll, damit im Hintergrund bei vorhandener VPN-Verbindung Google alle 20 Sekunden gepingt wird, dann immer her damit.

Ich habe nun mal die Datei in 02google_ping.sh umgeändert, da sich im /dispatcher.d-Ordner schon eine Datei befunden hat, die 01fupdown heißt.

Ich kann trotzdem nicht herausfinden, ob das Script nun läuft. Kann mir jemand sagen, was ich nun genau ins Terminal eingeben muss, damit ich das in Erfahrung bringen kann?

EDIT: In der Systemüberwachung taucht '02google_ping.sh' nicht auf.

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

mach doch einfach mal

touch /tmp/meintest.log
echo "$(date) ping-script" >> /tmp/meintest.log

hinter deinen ping-Aufruf

... und dann guckste ins File /tmp/meintest.log

ubuntuus3r

(Themenstarter)

Anmeldungsdatum:
13. Januar 2011

Beiträge: 21

Habe ich gemacht. Es wird aber kein File in TMP abgelegt. Auch nicht, nachdem ich ./02google_ping.sh im Terminal ausgeführt habe. Ideen?

Das Script sieht nun so aus:

#!/bin/sh

# stop google ping 
kill -9 $( ps aux | grep [p]ing | grep google | awk '{ print $2 }' ) 2>/dev/null

# start google ping
if [[ $2 == 'vpn-up' ]]; then
    # 20 sec interval
    ping -i 20 google.com
fi

# Log-File
touch /tmp/meintest.log
echo "$(date) ping-script" >> /tmp/meintest.log

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das Skript ist doch durchweg Murks.

Mit dem bedingungslosen töten, das hat Antiqua ja schon gesagt, und wenn ich das Ding teste, wirft er auch nur einen Fehler:

track@lucid:~$ ./testnetz.sh x vpn.up
./testnetz.sh: 11: [[: not found

Klar, eine Abfrage mit "[[ ... ]]" gibt es unter der Posix-Shell #!/bin/sh ja auch gar nicht.

Wer hat sowas nur verbrochen ...?

Oder konstruktiv gefragt: was willst Du denn überhaupt insgesamt erreichen, was muss das Skript genau können ?
Geht es wirklich nur um das pingen im 20-Sekunden-Takt ? - dafür reicht der Befehl: ping -i 20 google.com

Es macht ja keinen Sinn, mit einem kaputten Skript stundenlang herum zu testen.

track

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4536

mir hat das keine Ruhe gelassen. Das Urprungsscript war so bescheuert (lillt immer noch sich selber), ich musste da mal was friggeln. Auch wenn der TS nix sagt, wozu er sowas überhaupt braucht.

Folgendes funktioniert bei mir. Ich hab allerdings die bash als /bin/sh. Kann das mal jemand mit einer dash als /bin/sh auf Funktionstüchtigkeit testen?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

#die PID von laufenden ping
pingpid=$(ps -C ping -o pid=)

# start google ping, wenn vpn-up
if [ "$2" = 'vpn-up' ]
then
	# killt pings, sollten welche laufen (ALLE!!!!)
	if [ -n "$pingpid" ]
	then
    		kill -9 $pingpid
		echo -e "\n+++ alle vorhandenen pings gekillt +++"
	fi
	# startet neuen ping
	echo -e "\n+++ starte neuen ping +++\n"
	ping -i 3 google.com
	echo -e "\n--- ping wurde beendet ---\n"
fi
echo -e "\n=== scriptende ===\n"

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Antiqua schrieb:

.. Ich hab allerdings die bash als /bin/sh. Kann das mal jemand mit einer dash als /bin/sh auf Funktionstüchtigkeit testen?

Das ist doch nun wirklich kein Problem. Du kannst das doch selber, indem Du es ausdrücklich von der passenden Shell ausführen lässt:

dash  testnetz.sh

Wenn Du sowieso alle pings killen willst, brauchst Du Dir die Mühe mit den PIDs nicht zu machen. Dann tut es auch killall (→ man killall).

Bei mir stolpert er noch über die echo -e ... das ist wohl auch noch ein Bashismus.
(Du wirst die "\n" durch echte Zeilenumbrüche ersetzen müssen, oder durch z.B. eine Variable $n: n='\n')

track

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4536

track schrieb:

Antiqua schrieb: Das ist doch nun wirklich kein Problem. Du kannst das doch selber, indem Du es ausdrücklich von der passenden Shell ausführen lässt:

ich boote für so ein Script doch nicht extra irgendwas, wo die dash drauf ist 😉 Mit der ash, der bash, der ksh und der zsh läufts jedenfalls. Die tcsh meldet "Illegal variable name."

Wenn Du sowieso alle pings killen willst, brauchst Du Dir die Mühe mit den PIDs nicht zu machen. Dann tut es auch killall

killall sendet SIGTERM, wenn nix anderes angegeben ist und ist ein eigenes Programm. kill -9 sendet ein hartes SIGKILL, ist kürzer und ein Builtin (ausser natürlich bei der dash). Und da ich die Variable schon mal hab, will ich die natürlich auch benutzen ☺. Abgesehn davon ist mir killall irgendwie unsympathisch. Ich verwende es eigentlich nur im äussersten Notfall, wenn ein Programm amok läuft und viele Kinder (sic!) hat, z.B. ein abgehangener firefox mit flash-Problemen, nie in Scripten.

Bei mir stolpert er noch über die echo -e ... das ist wohl auch noch ein Bashismus.

Oder eine weitere Mangelerscheinung der dash (bzw. Abweichung vom quasi-Standard der ksh). Wobei das komisch ist, weil die dash doch von der ash kommt.

/bin/echo kennt -e und das wird (glaub ich wenigstens, bin mir da aber nicht 100 % sicher) von der ash mangels Builtin aufgerufen, das bash-Builtin kennt -e, das ksh-Builtin kennt -e.

OT
mit Einführung der dash als /bin/sh, nur um ein paar Sekunden schneller zu booten, hat sich Ubuntu meiner Meinung nach ja selber in den Fuß geschossen. Mein Netbook mit Luzzie bootet trotz Rückstellung /bin/sh → /bin/bash gefühlt gleich schnell... Ich verwende bei Shell-Scripten in Ubuntu übrigens durchgängig #!/bin/bash als She-Bang. Wenn die Scripte portabel sein sollen, sogar #!/usr/bin/env bash. Mir ist schon untergekommen, daß auf einem BSD-System (ksh) ein sh-Script ging, auf Ubuntu wegen der dash nicht. Frag mich jetzt aber nicht worans genau gelegen hat. ☺
/OT

(Du wirst die "\n" durch echte Zeilenumbrüche ersetzen müssen, oder durch z.B. eine Variable $n: n='\n')

man könnte statt 'echo' auch '/bin/echo' machen, oder das -e und die \n einfach löschen. Macht ja sowieso nur die Ausgabe etwas übersichtlicher. Man könnte sogar problemlos auf alle echo-Zeilen verzichten.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na ja, der kleinste gemeinsame Nenner ist doch im Zweifel die Bourne-Shell sh
und die Verkörperung davon ist bei Uby (und damit erstmal auch bei mir) die dash .

Dein "Quasi-Standard" ksh ist bei mir (Default Lucid) nicht einmal installiert.

Was jetzt auf Deinem System die sinnvollste Verkörperung dieser sh ist, kann ich nicht sagen, denn die anderen Shells habe ich für mich als "Exoten" zur Seite gelegt. Schließlich ist keine der Shells so genial, dass ich Lust hätte, mich mehr als nötig da hinein zu vertiefen.

Für mich ist es daher auch schwierig gegen zu prüfen, was so ein Skript bei Dir macht.
All die anderen Shells sind bei mir ja nicht einmal installiert. Und wie gesagt, die ganze Shellerei ist für mich nicht so spannend, dass ich sie mir installieren wollte.

man könnte statt 'echo' auch '/bin/echo' machen, ...

In den üblichen Skripten finde ich da eher zusätzliche (leere) echos - die sind auf jeden Fall kompatibel, wozu auch immer.

track

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4536

track schrieb:

Na ja, der kleinste gemeinsame Nenner ist doch im Zweifel die Bourne-Shell sh
und die Verkörperung davon ist bei Uby (und damit erstmal auch bei mir) die dash . Dein "Quasi-Standard" ksh ist bei mir (Default Lucid) nicht einmal installiert.

Sei froh, daß du als login- und interaktiv-shell die bash hast. Du kannst ja mal im Terminal die dash starten...

Und mit ksh-Standard meinte ich die Features der ksh. Die hat z.B. die bash ziemlich komplett implementiert, ist also faktisch (von den Feature-Kompatibilität der ksh gesehen) bei jeder Ubuntu-Variante login-shell. Und wenn du die zsh installierst, hast du automatisch ein /bin/ksh → /etc/alternatives/ksh → /bin/zsh, weil die zsh irgendwie auch eine aufgebohrte ksh ist. Wie das bei einem Default-Ubuntu aussieht, weiß ich nicht, weil mit das erste, was nachinstalliert wird, hier™ die zsh ist ☺

Was jetzt auf Deinem System die sinnvollste Verkörperung dieser sh ist, kann ich nicht sagen, denn die anderen Shells habe ich für mich als "Exoten" zur Seite gelegt. Schließlich ist keine der Shells so genial, dass ich Lust hätte, mich mehr als nötig da hinein zu vertiefen.

zsh (und zsh-lovers) installieren,

mv $HOME/.zshrc $HOME/.zshrc.bak.$(date +%x-%T) #eine ggf. vorhanden .zshrc sichern
wget -nv -O $HOME/.zshrc        http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc  #die default-zshrc von grml holen
zsh     # die zsh starten :)

alleine schon die Autokorrektur und die Tab-Vervollständigung sind genial. Wobei ich sie nur im Terminal benutze. Aber stimmt schon sie braucht Zeit, um sich einzuarbeiten.

ubuntuus3r

(Themenstarter)

Anmeldungsdatum:
13. Januar 2011

Beiträge: 21

@Antiqua: Im ersten Beitrag, erster Satz und am 17.01. 13:17 Uhr habe ich doch geschrieben was es soll. ☺ Da ich das Script aber noch nicht testen konnte, weiß ich nicht, ob ein einzelner Ping alle 20 Sekunden genügt, damit die Verbindung zum VPN nicht abreißt.

Um es aber noch mal auf den Punkt zu bringen: Es soll in Hintergrund bei bestehender VPN-Verbindung regelmäßig pingen. Von mir aus auch alle 10 Sekunden 3 Pings an Google.

Interessanter wäre natürlich herauszufinden, warum die Verbindung abreißt, aber dazu kenne ich mich zu wenig aus. Wireshark habe ich zwar installiert, doch kenne ich mich damit nicht aus, um es lesen und verstehen zu können, was da mit den Verbindungen passiert.

Antworten |