WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Ping-Abfrage in Linux

 

seackone
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2013, 15:02     Titel: Ping-Abfrage in Linux
  Antworten mit Zitat      
Hallo!
Mein kleines Skript greift auf eine Webseite zu, um sich von dort Messwerte zu beschaffen. Nun möchte ich beim Starten meines Skriptes zunächst prüfen, ob diese Webseite überhaupt verfügbar ist. Ich habe das mit einem einfachen Ping-Befehl realisiert. Vorher erfolgt eine Betriebssystemabfrage, da der Befehl sich zwischen Mac bzw. Linux und Windows leicht unterscheidet.

Nun sieht das Ganze etwa so aus (Beispiel jetzt einfach mal mit Ping an google):

Code:

if ismac == 1
status = dos('ping -c 3 www.google.de');

elseif isunix == 1
status = dos('ping -c 3 www.google.de');

elseif ispc == 1
status = dos('ping www.google.de -n 3');

end
 


Ich habe noch nie mit Unix gearbeitet, der Befehl sollte aber der Gleiche sein wie bei Mac. Jetzt ist es allerdings so, falls google unter Windows nicht angepingt werden kann, ist status=1. Für den gleichen Fall unter Mac ist status=2. Leider konnte ich für Unix nicht testen.. Wäre dort status (wie bei Mac) auch 2, falls kein Echo empfangen werden kann?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2013, 15:25     Titel:
  Antworten mit Zitat      
Siehe z.B: http://linux.die.net/man/8/ping
Zitat:
If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.

Wobei Du Mac und Unix ohne weiteres zusammenfassen kannst, da OS-X seit ein paar Jahren auf Unix aufbaut.
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2013, 16:25     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort. Dann sollte demnach "status" auf 1 gesetzt werden, sobald kein Echo empfangen wird. Eigentlich wie bei Windows.. Dann muss ich nachher nochmal schauen, warum "status" bei Mac auf 2 gesetzt wurde als ich keine Antwort erhalten habe. Dachte einfach da würde sich Mac von Windows unterscheiden.
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2013, 17:40     Titel:
  Antworten mit Zitat      
So nun habe ich doch nochmal geschaut. Also unter Mac heist es:

Zitat:
0 At least one response was heard from the specified host.

2 The transmission was successful but no responses were received.


Bei Windows gibt es anscheinend nur 0 und 1 für erfolgreich bzw. fehlgeschlagen. Bei Linux allerdings 0 für erfolgreich, 1 für fehlgeschlagen und 2 für einen anderen Fehler.
Wenn ich das richtig verstehe müsste ich unter Linux dann eine 1 erhalten, wenn ich nur die Anzahl der zu senden Pakete definiere und alle verloren gehen, also wenn die Seite nicht erreichbar ist. Aber unterscheidet sich ja dann doch wieder von Mac oder begreife ich irgendwas nicht? Very Happy

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2013, 12:02     Titel:
  Antworten mit Zitat      
Es ist doch ganz einfach: Bei 0 hat es funktioniert, sonst nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2013, 14:46     Titel:
  Antworten mit Zitat      
Meine Frage war allerdings nicht bei welchem Exitcode es funktioniert, sondern welchen Exitcode ich erhalte wenn ich kein Echo empfange. Bei PC sollte es eine 1 sein, Mac eine 2 und bei Unix (falls ich es richtig verstanden habe) wieder eine 1. Du sagtest ich kann Unix und Mac zusammenfassen. Anscheinend ja dann doch nicht. Was ist nun richtig?
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2013, 16:25     Titel:
  Antworten mit Zitat      
Du siehst selbst, je nach verwendetem ping-Programm kann es unterschiedliche Exitcodes geben. Zum Beispiel 68 für unknown host.
Also je nach Fehler gibt es irgendeinen Exitcode ungleich 0.
Code:

if ispc == 1
  status = dos('ping www.google.de -n 3');
else
  status = dos('ping -c 3 www.google.de');
end
if status == 0
  % erfolgreich
else
  % nicht erfolgreich
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2013, 17:13     Titel:
  Antworten mit Zitat      
Richtig. Nun habe ich allerdings etwas anderes vor. Und zwar möchte ich 2 Seiten anpingen und wenn mindestens 1 Echo empfangen wurde, kann das Skript fortgeführt werden.
Daher dachte ich mir das etwa so:

Code:
if ispc == 1
  status1 = dos('ping www.seite1.de -n 3');
  status2 = dos('ping www.seite2.de -n 3');

status = status1+status2

         if status <=1
         ...
         else
         ...
         end

end


Daher wär es nun schön zu wissen was Unix nun ausspuckt wenn kein Echo empfangen wird. Anhand deines zitierten Textes würde ich auf 1 Tippen..
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 11:39     Titel:
  Antworten mit Zitat      
Plus ist die falsche Operation:
Code:
if status1 & status2 == 0
 ...
else
 ...
end
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 13:38     Titel:
  Antworten mit Zitat      
Sehe ich nicht so. Wollte ja den Fall, falls mindestens eine Seite angepingt werden kann. Bei einem & müssen ja beide Seiten anpingbar sein.

Aber nun nochmal, ist ja doch eine recht einfache Frage: Welchen Wert hat mein Echo unter Unix wenn eine Seite nicht anpingbar ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 16:04     Titel:
  Antworten mit Zitat      
Zum letzten Mal:
status = 0: anpingbar -> logisch "falsch"
status != 0: nicht anpingbar -> logisch "wahr"
Code:

ist_anpingbar1 = !status1; % also gerade das Negierte
ist_anpingbar2 = !status2;

einer_von_beiden = ist_anpingbar1 | ist_anpingbar2;
% oder
einer_von_beiden = !status1 | !status2;
% oder
einer_von_beiden = !(status1 & status2);
% oder
einer_von_beiden = (status1 & status2)==0;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 19:48     Titel:
  Antworten mit Zitat      
Okay Sirius, ich habe verstanden das du mir Möglichkeiten aufzeigen möchtest, wie das Ganze gelöst werden kann. Mit dem Exit-Code von Unix war auch nur noch interessehalber, da du sagtest Mac basiert auf Unix.

Bei meinem Post mit dem & weis ich auch nicht an was ich da gedacht habe. Jedenfalls nicht an das logische "und". Natürlich hast du recht, dass die Bedingung auf mindestens 1 Echo mit einem & überprüft werden kann.

Hab das jedenfalls jetzt ohne "Betriebssystemabfrage" gelöst, da ich gestern gemerkt habe, dass Matlab7 damit nix anfangen kann.

Sieht jetzt jedenfalls so aus:

Code:

disp('Try to ping with Windows:');

status1 = dos('ping www.seite1.de -n 1');          % Pinganfrage an seite1 (Windows).
status2 = dos('ping www.seite2.de -n 1');          % Pinganfrage an seite2 (Windows).

    if logical(status1 && status2) == 0                 % Falls mindestens eine Seite angepingt werden konnte.
       
        disp('Test successful.');
       
    else                                                              % Wenn kein Echo empfangen wurde.
       
        disp('Try to ping with Mac or Unix:');        

        status1 = dos('ping -c 1 www.seite1.de');   % Pinganfrage an seite1 (Unix oder Mac).
        status2 = dos('ping -c 1 www.seite2.de');   % Pinganfrage an seite2 (Unix oder Mac).
       
       
        if logical(status1 && status2) == 0             % Falls mindestens eine Seite angepingt werden konnte.
           
            disp('Test successful.');
           
        else                                                           % Wenn kein Echo empfangen wurde wird das Programm geschlossen.
           
            disp('Test failed.');
            return;
           
        end
       
    end


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2014, 22:59     Titel:
  Antworten mit Zitat      
Hallo seackone,

Ein paar Kommentare:
Matlab 7.0 bis 7.14 kann die Unterscheidung der Betriebssysteme gut umgehen. Wenn estwas nicht wie gewünscht funktioniert, ist das sicherlich ein Programmierfehler.
Ich würde under Linux übrigens eher SYSTEM oder UNIX verwenden, statt DOS, aber es funktioniert zumindest.

In "logical(status1 && status2) == 0" ist die Umwandlung in ein LOGICAL überflüssig.
"logical(status1 && status2) == 0" passt nicht zum Kommentar "Falls mindestens eine Seite angepingt werden konnte." Besser: "if status1 | status2".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
seackone
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 30.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 13:06     Titel:
  Antworten mit Zitat      
Hallo Jan,
also ich hatte neulich mein Skript bei einem Bekannten mit Matlab 7.1 ausprobiert und dort schien es Probleme mit den Befehlen "ispc", "ismac" und "isunix" zu geben. Allerdings habe ich mich daran jetzt auch nicht großartig aufgehalten, da gab es wichtigere Sachen.

Okay vielen Dank für den Tip. Kenne mich da leider mit den Befehlen unter Unix nicht so sehr aus. Werde ich nachher noch ändern.

Bei dem & wird doch auf das logische "und" zurückgegriffen und laut Wahrheitstabelle:

0 0 -> 0
0 1 -> 0
1 0 -> 0
1 1 -> 1

sollte das doch funktionieren. Da hatte ich meinen Gedankenfehler 2 Posts zuvor, als ich schrieb:

Zitat:
Wollte ja den Fall, falls mindestens eine Seite angepingt werden kann. Bei einem & müssen ja beide Seiten anpingbar sein.


Das ist natürlich quatsch. Sobald ich von beiden Seiten kein Echo empfangen (seite1 = 1 und seite2 = 1) wird, startet die else-Anweisung. Bei mindestens einem Echo ist die if-Bedingung erfüllt.

Die Wandlung in Logical ist etwas unschön, ich weis. Bei status1 und status2 handelt es sich um skalare Größen. Mit nur einem & dazwischen erhalte ich eine Warnung:
"Use && insted of & as the AND operator in (scalar) conditional statements."
Ich kann natürlich die Warnung ignorieren und erspare mir die Wandlung in Logical, oder ich packe ein zweites & dazu und muss diese eben noch für die if-Abfrage machen.
Weis jetzt nicht was eleganter gelöst ist, aber denke auch letztendlich egal.

Falls ich immernoch irgendwo Verständnisprobleme haben sollte, dann bitte ich um Berichtigung Very Happy

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.