Hilfe beim Herrunterfahren Skript
-
Hallo,
wenn Du nicht viel Ahnung vom Programmieren hast, dann wäre der erste Schritt das zu ändern, denn dein Projekt forder schon einige Kenntnisse. Ich habe soetwas ähnliches schon mal gemacht, wobei das nicht in C++ geschah. Wenn Du es einfach haben möchtest, dann schau dir mal die Batchprogrammierung an. Damit ist es nicht so schwer.lg, freakC++
-
QuestX schrieb:
Hallo zusammen,
ich habe da so eine Idee im Kopf, aber habe von programmieren nicht viel Ahnung. Ich habe ein Netzwerk zu Hause mit einem Server auf dem Windows Server 2003 läuft. Der Server soll sich abends, wenn kein Rechner mehr an ist abschalten.
Meine Idee ist es ein Skript zu schreiben das abläuft und über einen Ping jede IP abfragt.
Rechner an, Ping erfolgreich --> wird eine Variable auf 1 gesetzt
Rechner aus, Ping erfolglos --> wird eine Variable auf 0 gesetzt
Als Endbedinung, in der auch der Herunterfahren Befehl steht, müssen alle Variablen den Wert 0 haben. Dann fährt der Server runter.Nun lässt sich sowas programmieren und ist es leicht umsetzbar?
Ich würde es gerne in C programmieren und dann später als dat-Datei ausführen mit Hilfe der Windows-zeitsteuerung
Ja, das ist möglich. Warum in C? Und was hat es mit der dat-Datei auf sich? Normalerweise entsteht eine exe-Datei.
Ein paar Ideen, wie man das ganze umsetzen könnte:
Zunächst müsste man sich entscheiden, ob UDP ausreicht oder, ob TCP notwendig ist.
Wenn du UDP nimmst, ist es ganz einfach:
Jeder PC schickt einfach alle 2 Minuten eine Nachricht an den Server-PC.
Der Server-PC hat eine Variable die jeweils die Zeit speichert, an der die letzte Nachricht eingegangen ist. Ist diese Zeit irgendwann mal größer als z.B. 10 Minuten fährt der Server herunter. Fertig.Wenn du TCP nimmst, ist es etwas komplexer, da du zusätzlich noch die Verbindungen verwalten musst.
Das Prinzip ist jedoch im Endeffekt genau das gleiche.Alles in allem sollte das kein Problem sein. Funktionen zum Herunterfahren des PCs findet man im Internet genug und im Notfall macht man es einfach mit system und übergibt "shutdown" oder wie das bei deinem Betriebssystem auch immer lauten mag.
-
@echo off ping meinPC1 if %errorlevel%==0 goto machnichts ping meinPC2 if %errorlevel%==0 goto machnichts shutdown :machnichts echo Es sind noch PCs erreichbar
Das alles in eine .bat Datei und du hast ungefähr was du willst. Du kannst es noch nach Belieben ausschmücken. Z.B. kann man das Skript einige Zeit warten und dann vorne beginnen lassen , bis der Server heruntergefahren ist.
Das ist natürlich nur eine simple Umsetzung DEINER Idee. Welche Fallstricke noch exitieren ist nicht bedacht.
-
Da du anscheint nicht sehr viel vom programmieren verstehst
und ein Script erwähnst, sollte eine Batch hier angebracht sein.:start FOR /L %i IN (0,1,255) DO ping 168.192.1.%i & set /a Aus=%Aus%+%errorlevel% IF %Aus% NEQ 0 DO shutdown /s /t 00 goto :start
sollte funktionieren
hab's nicht getestet
ein Moderator sollte das Ganze hier vielleicht verschieben
-
irgendwer schrieb:
Da du anscheint nicht sehr viel vom programmieren verstehst
und ein Script erwähnst, sollte eine Batch hier angebracht sein.:start FOR /L %i IN (0,1,255) DO ping 168.192.1.%i & set /a Aus=%Aus%+%errorlevel% IF %Aus% NEQ 0 DO shutdown /s /t 00 goto :start
sollte funktionieren
hab's nicht getestet
ein Moderator sollte das Ganze hier vielleicht verschiebenHabe es auch nicht getestet, aber ein eventuelles Problem bei deiner Variante ist, dass sich der ausführende PC selber mit einbezieht. Und wenn er dieses Script ausführen kann, ist er natürlich auch erreichbar. Damit würde shutdown nie ausgeführt werden.
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
BBBB schrieb:
Habe es auch nicht getestet, aber ein eventuelles Problem bei deiner Variante ist, dass sich der ausführende PC selber mit einbezieht. Und wenn er dieses Script ausführen kann, ist er natürlich auch erreichbar. Damit würde shutdown nie ausgeführt werden.
stimmt
aber dafür muss man nur die 0 in der IF Abfrage durch eine 1 ersetzenund was mir grade auffällt:
%i zu %%i ändern
und am Anfang ein setlocal einfügen damit %Aus% auf jeden Fall gelöscht wird
-
irgendwer schrieb:
Da du anscheint nicht sehr viel vom programmieren verstehst.
...
sollte funktionieren
hab's nicht getestetMein letzter Beitrag war wohl zu rüde und wurde liquidiert. Ich fand es nur sehr anmaßend dem Threadstarter mangelndes Programmierverständnis zu attestieren und dann mit so einer Lösung zu daherzukommen, bei der (fast) nichts stimmt.
Was soll die Zumüllung des Netzwerks?
Was bedeutet ping 192.168.1.0?
Wie soll %Aus% je 0 bleiben?Und dann noch die falsche Syntax.
Darauf wollte ich vorher nur kurz und prägnant hinweisen.
Hoffe dem allmächtigen volkard ist das jetzt nicht zu rüde.
-
irgendwer schrieb:
stimmt
aber dafür muss man nur die 0 in der IF Abfrage durch eine 1 ersetzenIch würde zuerst nochmal durchatmen und in Ruhe drübersehen. Denn das macht es auch nicht besser.
-
stimmt mein Lösungsvorschlag ist nicht ganz richtig
ok dann werde ich den mal verbessernsetlocal :start rem durch gehen aller lokalen IPs rem bei erfolg liefert ping 0 und bei Zeitüberschreitung/ungültig 1 FOR /L %%i IN (0,1,255) DO ping 168.192.1.%%i & set /a Aus+=%errorlevel% rem 2 IPs werden auf jeden Fall antworten rem der Router und der PC auf dem die .bat läuft rem 256-2=254 IF %Aus% EQU 254 DO shutdown /s /t 00 rem für jedes Gerät mit einer IP, das nicht beachtet werden soll die Zahl um 1 verringern rem falls ein PC noch an ist, nochmal testen goto :start
Und dann noch die falsche Syntax.
Wo war die Syntax falsch?
nur in einer .bat muss es %%i heißen, in der cmd wär das sogar ein fehler
Das FOR /L geht natürlich nur wenn man die Befehlszeilenerweiterungen (oder MS das nennt) einschaltet (bei XP Standart, Server 2003 müsste das auch haben)Threadstarter mangelndes Programmierverständnis zu attestieren
Ich seh rot wenn jemand scripten und programmieren synonym verwendet
Was bedeutet ping 192.168.1.0?
anpingen eines Gräts mit dieser IP
-
erstmal sorry für Doppelpost
Beim Testen hab ich erkannt, dass das %errorlevel% durch !errorlevel! ersetzt werden muss, damit errorlevel erst expandiert wird, wenn es gebraucht wird.
Sonst wird immer der errorlevel des letzten Befehls vor der FOR-Schleife benutztbei ping kann man noch mit den parameter -w ein Zeitlimit setzen, damit es schneller geht, oder den Bereich der IPs runtersetzen (dann aber auch den Wert beim IF ändern
-
irgendwer schrieb:
nur in einer .bat muss es %%i heißen, in der cmd wär das sogar ein fehler
Was heißt "nur"? Wie hast du dir das sonst gedacht, z.B. mit dem goto?
irgendwer schrieb:
Ich seh rot wenn jemand scripten und programmieren synonym verwendet
Haarspalter!
irgendwer schrieb:
anpingen eines Gräts mit dieser IP
Schon mal einem "Gerät" diese spezielle IP-Adresse gegeben? Oder die 192.168.1.255?
Dir fehlen noch etwas die Netzwerkgrundlagen.
Nebenbei, was denkst du wie lange so ein Durchlauf mit über 250 pings dauert?
Wer sagt, dass die PCs nur in einem Subnet sitzen?
Das Polling hab ich ja schon angesprochen.Dein Vorschlag ist zwar gut gemeint, aber praktikabel ist er nicht. Der Ansatz ist einfach verkehrt.
-
Sorry, hab deinen Beitrag nicht gesehen.
Wie es aussieht hast du selbst erkannt, dass das Skript noch ein paar Probleme hat. Ich würde nicht mehr daran rumdoktern. Es geht mit anderen Ansätzen einfacher und schneller.
-
irgendwer schrieb:
stimmt mein Lösungsvorschlag ist nicht ganz richtig
ok dann werde ich den mal verbessernsetlocal :start rem durch gehen aller lokalen IPs rem bei erfolg liefert ping 0 und bei Zeitüberschreitung/ungültig 1 FOR /L %%i IN (0,1,255) DO ping 168.192.1.%%i & set /a Aus+=%errorlevel% rem 2 IPs werden auf jeden Fall antworten rem der Router und der PC auf dem die .bat läuft rem 256-2=254 IF %Aus% EQU 254 DO shutdown /s /t 00 rem für jedes Gerät mit einer IP, das nicht beachtet werden soll die Zahl um 1 verringern rem falls ein PC noch an ist, nochmal testen goto :start
Die Rechnung stimmt immer noch nicht, denn die Broadcastadresse 192.168.1.255 liefert dir auch ein errorlevel 0