shutdown restart unter Windows

Begonnen von cotecmania, 28 Oktober 2013, 21:42:35

Vorheriges Thema - Nächstes Thema

cotecmania

Hallo,

Unter windows scheint der restart nicht zu funktionieren.
Bei "shutdown restart" wird zwar die Console beendet aber nicht wieder neu gestartet.

Eine Installation als Dienst (runassrv) und dort die Konfiguration mit einem automatischen Restart funktioniert auch nicht.
Der Dienst bleibt als gestartet weiterhin vorhanden

Kennt jemand ne Lösung ?

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Joachim

FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

cotecmania

Der Link bringt mich zur Übersicht "Server-Windows" ???
Hab die Suchfunktion benutzt aber nix gefunden
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Joachim

Sind nur 18 Treads, Überschriften lesen, Lösung finden

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

ChrisD

Hallo,

Ich starte FHEM über eine CMD-Datei und habe fhem.pl so geändert dass beim Aufruf von 'shutdown restart' ein anderer Exit-Code als bei einem einfachen 'shutdown' zurückgegeben wird. In der CMD-Datei prüfe ich den Exit-Code und starte FHEM neu wenn nötig.

Mit dem Dienst habe ich es noch nicht probiert, hier kann ich nichts dazu sagen.

Grüße,

ChrisD

Joachim

Moin ChrisD,
geht doch.

Bei dieser Lösung bitte daran denken, dass die Änderung neu eingespielt werden muss, wenn die fhem.pl aktualisiert wird.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

ChrisD

Hallo,

Es ist schon klar dass man diese Änderung bei jedem Update nachpflegen muss. Ich mache aber nur selten Updates, deshalb stört mich das nicht weiter.

Grüße,

ChrisD

ChrisW

Raspberry PI3 mit allem möglichen.

cotecmania

Naja den Thread bzw. die "Lösung" habe ich schon gefunden, aber das ist keine Lösung für "shutdown restart" sondern ein Workaround dafuer, der nach dem 8ten mal nicht mehr funktioniert !!!

Wenn dann bitte eine Endlosschleife :

cd c:/Fhem/

:NOCHMAL
perl fhem.pl fhem.cfg
GOTO NOCHMAL

Aber wie gesagt, das ist keine richtige Lösung, denn beim reinen "shutdown" wird auch sofort wieder gestartet.
Und die fhem.pl selbst zu aendern ist quatsch, da fast taeglich updates kommen.

Immer noch auf der Suche nach der sauberen "Lösung" ;-)) ...
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

ChrisW

Tja danach hab ich auch ewig gesucht ... gibt es wohl nicht ohne umbasteln. Aber nu hab ich nen Raspberry auch schon wegen Presence Modul und muss sagen funktioniert alles besser und schneller.
War einfach zu viel was unter Win nicht mal so eben richtig funktioniert hat.
Raspberry PI3 mit allem möglichen.

ChrisD

Hallo,

Im Moment kann 'shutdown restart' unter Windows nur durch eine Änderung in fhem.pl erreicht werden. Die saubere Lösung wäre das Ganze mittels Win32::Process::Create zu realisieren, dabei wäre auch keine externe CMD-Datei mehr nötig.

Bei Interesse kann ich zum Testen eine Funktion für 99_myutils zur Verfügung stellen.

Grüße,

ChrisD

Joachim

Moin ChrisD,

http://forum.fhem.de/index.php/topic,9965.0.html
letzter Beitrag. Vielleicht ist das das richtige.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

ChrisD

Hallo,

Der von dir genannte Beitrag ist eine Lösung die zwar funktioniert aber einige Schwachpunkte hat:

- in der HOWTO (http://fhem.de/HOWTO_Windows.html) fehlt der Hinweis dass nicht nur Win32::Daemon installiert sein muss sondern auch Win32::Console
- die Fehlermeldungen die auf der Konsole stehen gehen verloren
- die Restart-Logik ist nicht sauber, der Befehl exec('cmd.exe /C net stop fhem & net start fhem'); in fhem.pl führt dazu dass der Dienst beendet wird bevor der cmd-Befehl überhaupt ausgeführt wird, der 'net stop' Befehl ist somit überflüssig und führt auch zu einer Fehlermeldung (Dienst läuft nicht mehr). Weiterhin wird der Dienst 2 Mal beendet und gestartet wenn man über das Web-Interface den Befehl 'shutdown restart' eingibt (zumindest mit Firefox und IE). Im Logfile sieht das dann so aus:
2013.10.30 11:33:29 4: Connection accepted from FHEMWEB:127.0.0.1:57657
2013.10.30 11:33:29 4: HTTP FHEMWEB:127.0.0.1:57657 GET /fhem&cmd=shutdown+restart
2013.10.30 11:33:29 0: Server shutdown
2013.10.30 11:33:31 1: registering fhem as Windows Service
2013.10.30 11:33:31 1: starting fhem as a service
2013.10.30 11:33:31 1: Including d:/Projekte/Test/fhem-5.5/fhem.cfg
2013.10.30 11:33:31 3: telnetPort: port 7072 opened
2013.10.30 11:33:32 3: WEB: port 8083 opened
2013.10.30 11:33:32 3: WEBphone: port 8084 opened
2013.10.30 11:33:32 3: WEBtablet: port 8085 opened
2013.10.30 11:33:32 2: eventTypes: loaded 0 events from ./log/eventTypes.txt
2013.10.30 11:33:32 1: Including ./log/fhem.save
2013.10.30 11:33:32 3: initialUsbCheck return value: This command is not yet supported on windows
2013.10.30 11:33:32 2: SecurityCheck:  WEB,WEBphone,WEBtablet has no basicAuth attribute. telnetPort has no password/globalpassword attribute.  Restart fhem for a new check if the problem is fixed, or set the global attribute motd to none to supress this message.
2013.10.30 11:33:32 0: Server started with 9 defined entities (version $Id: fhem.pl 4099 2013-10-22 20:55:35Z rudolfkoenig $, os MSWin32, user SYSTEM, pid 5044)
2013.10.30 11:33:32 4: Connection accepted from FHEMWEB:127.0.0.1:57658
2013.10.30 11:33:32 4: HTTP FHEMWEB:127.0.0.1:57658 GET /fhem&cmd=shutdown+restart
2013.10.30 11:33:32 0: Server shutdown
2013.10.30 11:33:34 1: registering fhem as Windows Service
2013.10.30 11:33:34 1: starting fhem as a service
2013.10.30 11:33:34 1: Including d:/Projekte/Test/fhem-5.5/fhem.cfg
2013.10.30 11:33:34 3: telnetPort: port 7072 opened
2013.10.30 11:33:35 3: WEB: port 8083 opened
2013.10.30 11:33:35 3: WEBphone: port 8084 opened
2013.10.30 11:33:35 3: WEBtablet: port 8085 opened
2013.10.30 11:33:35 2: eventTypes: loaded 0 events from ./log/eventTypes.txt
2013.10.30 11:33:35 1: Including ./log/fhem.save
2013.10.30 11:33:35 3: initialUsbCheck return value: This command is not yet supported on windows
2013.10.30 11:33:35 2: SecurityCheck:  WEB,WEBphone,WEBtablet has no basicAuth attribute. telnetPort has no password/globalpassword attribute.  Restart fhem for a new check if the problem is fixed, or set the global attribute motd to none to supress this message.
2013.10.30 11:33:35 0: Server started with 9 defined entities (version $Id: fhem.pl 4099 2013-10-22 20:55:35Z rudolfkoenig $, os MSWin32, user SYSTEM, pid 3164)


Ich habe deshalb eine Funktion in 99_myutils hinzugefügt die den Neustart auch unter Windows korrekt durchführt, mit dem neuen cmdalias-Modul müsste es sogar möglich sein bei 'shutdown restart' nicht mehr die Funktion in fhem.pl sondern die in 99_myutils aufzurufen. Damit wäre das Problem für Windows-Benutzer die den Dienst nicht verwenden gelöst ohne dass Änderungen am FHEM-Programmcode nötig wären.

Grüße,

ChrisD

ChrisD

Hallo,

Mit dem cmdalias-Modul kann man das Problem unter Windows wie folgt beheben:

- FHEM auf den aktuellen Stand bringen und wenn nötig neu starten
- Win32::Process über cpan installieren falls nicht schon vorhanden (cpan -i Win32::Process)
- folgende Funktion in 99_myutils einfügen
sub
ShutdownRestartWin() {
  if (($^O !~ m/Win/)||($winService->{AsAService})) {
    CommandShutdown(undef,"restart");
  } else {
    DoTrigger("global", "SHUTDOWN", 1);
    Log 0, "ShutdownRestartWin - Server shutdown";
   
    foreach my $d (sort keys %defs) {
      CallFn($d, "ShutdownFn", $defs{$d});
    }

    WriteStatefile();
    unlink($attr{global}{pidfilename}) if($attr{global}{pidfilename});
    eval {
      use Win32::Process;
      my $windir=$ENV{'windir'};
      $windir='c:\windows' if (!defined $windir);
      my $p;
      Win32::Process::Create( $p,$ENV{'windir'}.'\system32\cmd.exe',"/C \"(ping -n 1 -w 3000 1.1.1.1 & $^X $0 $attr{global}{configfile})\"",0,NORMAL_PRIORITY_CLASS,"." );   
      exit(0);
    }
  }
}

- in der FHEM-Kommandozeile 99_myutils neu laden
reload 99_myutils
- in der FHEM-Kommandozeile folgendes cmdalias-Objekt anlegen:
define srwin cmdalias shutdown restart AS {ShutdownRestartWin()}
- Konfiguration speichern (Save config anklicken)
- in der FHEM-Kommandozeile shutdown restart eingeben zum Neustarten

Da keine FHEM-Dateien geändert werden übersteht die Lösung auch zukünftige Updates.

Grüße,

ChrisD

Spiff

Hi ChrisD,

vielen Dank für diese Lösung!
Ich habe sie gerade eingebaut und sie funktioniert gut mit ActivePerl 32bit unter Windows 7 64bit.

Viele Grüße
Spiff

iCure

Hi ChrisD,

die Lösung funktioniert super, allerdings starte ich seither meinen Server als Dienst. Durch Eingabe von "shutdown restart" wird dieser Dienst beendert, und der Server neu gestartet, allerdings nicht mit dem eigentlich erstellten Dienst.

Durch was läuft das ganze nun, wenn nicht über den eigentlichen Dienst?

ChrisD

Hallo,

Wenn du FHEM als Dienst startest ist der Code aus Beitrag 13 nicht nötig. In dem Fall wird der Dienst aus fhem.pl aus gestoppt und neu gestartet.

Ich habe nicht verstanden was du mit
Zitatallerdings nicht mit dem eigentlich erstellten Dienst
gemeint hast. Ob FHEM als Dienst startet kannst du in der Log-Datei sehen. Als Dienst gibt es den Eintragregistering fhem as Windows Service

Das Neustarten des Dienstes erfolgt allerdings nicht ganz sauber wie in Beitrag 12 beschrieben. Der folgende Code (statt dem aus Beitrag 13) sollte dies beheben:

sub
ShutdownRestartWin() {
if ($^O !~ m/Win/) {
CommandShutdown(undef,"restart");
} else {
DoTrigger("global", "SHUTDOWN", 1);
Log 0, "ShutdownRestartWin - Server shutdown";

foreach my $d (sort keys %defs) {
  CallFn($d, "ShutdownFn", $defs{$d});
}

WriteStatefile();
unlink($attr{global}{pidfilename}) if($attr{global}{pidfilename});
eval {
use Win32::Process;
use Win32::Daemon;

my $windir=$ENV{'windir'};
$windir='c:\windows' if (!defined $windir);
print $windir;
my $p;
if (($winService->{AsAService})) {
# use the OS SCM to start the service
Win32::Daemon::State( SERVICE_STOPPED );
Win32::Daemon::StopService();
Win32::Process::Create( $p,$ENV{'windir'}.'\system32\cmd.exe',"x /C \"(ping -n 1 -w 3000 1.1.1.1 & net start fhem)\"",0,NORMAL_PRIORITY_CLASS,"." );
} else {
Win32::Process::Create( $p,$ENV{'windir'}.'\system32\cmd.exe',"x /C \"(ping -n 1 -w 3000 1.1.1.1 & $^X $0 $attr{global}{configfile})\"",0,NORMAL_PRIORITY_CLASS,"." );
}
};
exit(0);
}
}
Damit sollte sowohl die Fehlermeldung
ZitatDienst "fhem server" wurde unerwartet beendet. Dies ist bereits x Mal passiert.
in der Ereignisanzeige wie auch das teilweise starten, stoppen und nochmal starten behoben sein.

Grüße,

ChrisD