FHEM Forum

FHEM - Hardware => Server - Windows => Thema gestartet von: cotecmania am 28 Oktober 2013, 21:42:35

Titel: shutdown restart unter Windows
Beitrag von: cotecmania am 28 Oktober 2013, 21:42:35
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: Joachim am 28 Oktober 2013, 21:45:12
http://forum.fhem.de/index.php/board,34.0.html
Titel: Antw:shutdown restart unter Windows
Beitrag von: cotecmania am 28 Oktober 2013, 22:51:12
Der Link bringt mich zur Übersicht "Server-Windows" ???
Hab die Suchfunktion benutzt aber nix gefunden
Titel: Antw:shutdown restart unter Windows
Beitrag von: Joachim am 28 Oktober 2013, 23:04:56
Sind nur 18 Treads, Überschriften lesen, Lösung finden

Gruß Joachim
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 29 Oktober 2013, 17:36:12
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: Joachim am 29 Oktober 2013, 17:40:34
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 29 Oktober 2013, 18:44:44
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisW am 29 Oktober 2013, 19:36:59
Schau mal hier das ist die beste Lösung für mich ;)

http://forum.fhem.de/index.php/topic,10475.msg92981.html#msg92981
Titel: Antw:shutdown restart unter Windows
Beitrag von: cotecmania am 29 Oktober 2013, 20:28:51
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" ;-)) ...
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisW am 29 Oktober 2013, 20:39:30
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.
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 29 Oktober 2013, 23:13:18
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: Joachim am 30 Oktober 2013, 07:44:46
Moin ChrisD,

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

Gruß Joachim
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 30 Oktober 2013, 11:39:58
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 31 Oktober 2013, 08:59:09
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: Spiff am 10 Dezember 2014, 12:55:26
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
Titel: Antw:shutdown restart unter Windows
Beitrag von: iCure am 29 Dezember 2014, 17:12:30
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?
Titel: Antw:shutdown restart unter Windows
Beitrag von: ChrisD am 29 Dezember 2014, 22:17:50
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
Zitat
allerdings 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
Zitat
Dienst "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