![]() |
100 Server parallel überprüfen, ob Sie online sind?
Guten Abend,
ich würde gerne ein Überwachungsprogramm schreiben, welches den Status von 100 Server überprüft (Online oder Offline). Meine Idee wäre mit Hilfe einer Ping Unit und Multithreads. Hier ist mein Problem, dass ich keine Multithreads programmieren kann bzw. nicht weiß, wie man das umsetzt. Gibt es eventuell noch eine andere Mäglichkeit (leichter)? Eventuell eine Server/Client Geschichte? Die Überprüfung wird nur von einem Rechner ausgeführt. Die Server sollen den Status nicht senden. Bitte lasst mich an euren Erfahrungen oder Lösungen teilhaben. Vielen Dank im voraus. Sven |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Sowas gibts schon fertig, gut und kostenlos, z.B.
![]() Das wäre wohl die leichteste Variante. Basiert auf Client/Server und ein Rechner kann alles überprüfen. Das geht auch über das "Online sein" hinaus, du kannst auch z.B. den Status einzelner Dienste prüfen und vieles mehr. |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Na dann lernst du halt wie man Multithreading benutzt. So schwer ist das sicher nicht! :) Ich glaube, dass Luckie mal ein Programm schrieb, welches alle IPs in einem Subnetz anpingte. Vielleicht hilft dir das, wenn du dir das mal anschaust?
Eine sinnvollere Lösung - falls du Zugriff auf die Server hast - wäre übrigens Broadcast. Unter Linux:
Code:
Und in der Datei /etc/sysctl.conf den Wert net.ipv4.icmp_echo_ignore_broadcasts auf 0 gesetzt und schon hätte man was effizienteres. Der Server sendet einen Broadcast-Ping an alle (z.B. "ping -b 10.255.255.255") und wertet die Antworten aus. Andere Möglichkeit wäre noch Multicast. Was effizienteres fällt mir i.M. nicht ein.
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Liebe Grüße, Valle |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Die Software sieht interessant aus aber ich würde es gerne selber machen. Soll heißen selber programmieren. Die Überwachungssoftware ist schon programmiert. Jetzt muss nur noch der Automatismus für die Serverüberprüfung implementiert werden.
Ich schaue mir mal das Programm von Luckie an. Ich glaube, ich werde in Richtung Multithreads gehen. Kennt einer gute Lernbeispiele außer das von Luckie |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Hm. Ein Beispiel kenne ich jetzt nicht, aber
![]() Im Grunde ist es ganz einfach. Du leitest dir eine eigene Klasse von TThread ab und überschreibst dabei die Execute-Methode. In dieser wird dein eigener Code ausgeführt, dort kannst du dann z.B. den Ping absetzen. Erstellen tust du den Thread dann z.B. so:
Delphi-Quellcode:
Was meiner Meinung nach manchmal etwas nervig, kompliziert oder fehleranfällig ist, ist das Weiterleiten von Informationen des Threads an den Main-Thread, bzw. VCL-Sachen/Fenster. Behalte dabei immer im Hinterkopf, dass du aus der Execute-Methode, bzw. Methoden, die von Execute aus aufgerufen werden, nichts mit der VCL machen darfst. D.h. wenn dein Thread beispielsweise den Text eines Labels ändern will oder in ein TListView ein TListItem hinzufügen möchte, muss das über die Synchronize()-Methode des Threads oder andere Mechanismen wie SendMessage oder PostMessage passieren. Das gilt auch für hässliche globale/gemeinsame Variablen, sofern die benutzt werden - der Zugriff darauf sollte immer nur von einem Thread aus gleichzeitig erfolgen, also eventuell noch über CriticalSections informieren, das könnte auch hilfreich sein.
var
T: TMeinThread; begin T := TMeinThread.Create(True); //Thread angehalten erstellen T.FreeOnTerminate := True; //Freigeben wenn Execute-Methode fertig T.Resume; //Thread starten end; Viel Erfolg :thumb: |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Wenn du mal Threads drauf hast, dann würde ich das ganze wie folgt machen:
Hier mal ein wenig Code, frei Hand; sollten also Fehler auftreten, dann garantiere ich für nix :wink:
Delphi-Quellcode:
uses
Classes // hier ist die TThread-Klasse drin SysUtils; const WM_SERVER_STATUS = WM_USER + 2; type TServerStatus = (ssUnknown, ssOkay, ssUnreachable); PServerStatusResponse = ^ServerStatusResponse; RServerStatusResponse = record Address : String; Status : TServerStatus; end; type TServerCheckThread = class(TThread) private FWatcherHandle : HWND; FServerAddress : String; protected procedure Execute(); override; public property WatcherHandle : HWND read FWatcherHandle write FWatcherHandle; property ServerAddress : String read FServerAddress write FServerAddress; end; procedure TServerCheckThread.Execute(); var sr : PServerStatusResponse; begin while (not Terminated) do begin // // Ping ServerAddress... // New(sr); sr^.Address := Self.ServerAddress sr^.Status := ... ; // set server status after ping SendMessage(FWatcherHandle, WM_SERVER_STATUS, Integer(sr), 0); // sleep 10 sec. between two checks... SleepEx(10000, True); end; end; { ... } type TServerWatcher = class(TObject) private FHandle : HWND; FWatcherThreads : TList; FServerStatus : TStringList; procedure WndProc(var Msg:TMessage); procedure OnServerStatus(var Msg: TMessage); message WM_SERVER_STATUS; public property Handle : HWND read FHandle; constructor Create(); reintroduce; destructor Destroy(); override; procedure StartWatcherThread(const AServerAddress: String); end; procedure TServerWatcher.WndProc(var Msg: TMessage); begin Dispatch(Msg); end; procedure TServerWatcher.OnServerStatus(var Msg: TMessage); var sr : PServerStatusResponse begin sr := PServerStatusResponse(msg.WParam); try FServerStatus.Values[sr^.Address] := ... ; // cast sr^.Status to a good format finally // free memory (important!) Dispose(sr); end; end; constructor TServerWatcher.Create(); begin inherited Create(); // allocate handle FHandle := AllocateHWnd(WndProc); // create thread list FWachterThreads := TList.Create(); // create server status list FServerStatus := TStringList.Create(); end; destructor TServerWatcher.Destroy(); var i : Integer; wt : TWatcherThread; begin // free threads and thread-container for i := FWachterThreads.Count - 1 downto 0 do begin wt := FWachterThreads[i]; wt.Terminate(); WaitForSingleObject(FStartupThread.Handle, 1000); FreeAndNil(wt); end; FreeAndNil(FWachterThreads); // free server-status list FreeAndNil(FServerStatus); // free handle DeallocateHWnd(FHandle); inherited Destroy(); end; procedure TServerWatcher.StartWatcherThread(const AServerAddress: String); var wt : TWatcherThread; begin // create status for server in list FServerStatus.Add(AServerAddress + '=' + ... ); // cast ssUnknown to a good format // create sleeping watcher-thread wt := TWatcherThread.Create(True); wt.WatcherHandle := FHandle; wt.ServerAddress := AServerAddress; FThreadList.Add(wt); wt.Start(); end; |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Vielen Dank. Das ist ja eine Menge Quellcode, den ich erstmal verstehen muss. Aber sehr genial.
Schönen Vatertag. |
Re: 100 Server parallel überprüfen, ob Sie online sind?
Sind da Threads überhaupt notwendig? 100 Server ist nicht so die Menge. Du könntest doch in einem Thread die 100 ICMP-Pakete losschicken und dann einfach nur die Antwortpackete auswerten.
|
Re: 100 Server parallel überprüfen, ob Sie online sind?
Zitat:
|
Re: 100 Server parallel überprüfen, ob Sie online sind?
Zitat:
Gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz