CoProcess: Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „{{Baustelle}} Dieser Artikel soll Hinweise und Best Practices im Umgang mit dem Modul CoProcess.pm und den daraus bereitgestellten Funktionen bieten. CoProces…“)
 
Keine Bearbeitungszusammenfassung
Zeile 19: Zeile 19:


= Benutzung =
= Benutzung =
=== Vorbereitung ===
* Um die CoProcess Routinen zu verwenden werden diese mit <code>use CoProcess;</code> eingebunden.
* Danach müßen im Device-Hash Information zum externen Prozess hinterlegt werden. Dies geschieht z.b. in der DefineFn:
:<syntaxhighlight lang="perl" xstyle="width:80%;">
$hash->{CoProcess} = {  name => 'alexaFHEM',
                        cmdFn => 'alexa_getCMD',
                      };
</syntaxhighlight>


$hash->{CoProccess}
:{| class="wikitable"
  name
|-
  cmdFn
! Parameter !! Optional !! Beispiel !! Beschreibung
|-
| '''<code>name</code>''' || nein || 'alexaFHEM' || Ein Name für diese CoProcess Klasse. Wird verendet um Defaults für Reading- und Attribut-Namen zu erzeugen.
|-
| '''<code>cmdFn</code>''' || nein || 'alexa_getCMD' || Der Name der Perlfunktion, die die komplette Kommandozeile des zu startenden Prozesses liefert. Wird mit dem Device-Hash als Parameter aufgerufen. Kann '''<code>undef</code>''' zurückliefen wenn nichts gestartet werden soll oder kann.
|}


$hash->{logfile}
* Das Modul muss eine ReadFn Implementieren in der <code>CoProcess::readFn($hash)</code> aufgerufen wird.
$hash->{currentlogfile}


nrarchive


CoProcess::start
CoProcess::stop
CoProcess::terminate


=== Starten und Stoppen ===


= Einschränkungen =
  '''<code>CoProcess::start($)</code>'''
  '''<code>CoProcess::stop($)</code>'''
  '''<code>CoProcess::terminate($)</code>'''


=== Logfile handling ===


== Verwenden von UndefFn, DelayedShutdownFn und ShutdownFn um laufende CoProzesse zu beenden ==


Wenn gerade ein BlockingCall läuft und man will FHEM herunterfahren oder neustarten kann das problematisch werden, da ja immer noch Unterprozesse laufen und so einen kompletten Stop verhindern können.
=== Lesen und Schreiben ===


Daher muss in der [[DevelopmentModuleIntro#X_Undef|UndefFn]], [[DevelopmentModuleIntro#X_DelayedShutdown|DelayedShutdownFn]] und [[DevelopmentModuleIntro#X_Shutdown|ShutdownFn]] des Moduls sichergestellt werden, dass ein laufender BlockingCall beendet wird.  
  '''<code>CoProcess::readFn($)</code>'''
Muß in der ReadFn des Moduls verwendet werden um
 
=== Relevante Internals ===
{| class="wikitable"
|-
! Internal !! Optional !! Beschreibung
|-
| '''<code>logfile</code>''' || ja || Muster für den Logfile Namen. Bei '''FHEM''' wird  Siehe {{Link2CmdRef|Anker=FileLog}}. Beispiel: '''./log/alexa-%Y-%m-%d.log'''. Bei '''FHEM''' wird das Standard FHEM Logfile verwendet. Wenn nicht gesetzt werden die Prozess ausgaben nicht automatisch geloggt.
|-
| '''<code>currentlogfile</code>''' || - || Wird von CoProcess automatisch auf den Namen des Aktuellen Logfiles gesetzt wenn '''<code>logfile</code>''' verwendet wird.
|-
| '''<code>log</code>''' || - || Filehandle des offenen Logfiles.
|-
| '''<code>PID</code>''' || - || Enthält die PID des laufenden Prozesses.
|-
| '''<code>FH</code>''' || - || Enthält den Filehandle um dem Prozess zu kommunizieren. Zum lesen sollte '''<code>CoProcess::readFn($)</code>''' verwendet werden.
|}
 
=== Relevante Attribute ===
 
Im FHEM-Device das CoProcess mit einem Logfile verwendet kann das <code>nrarchive</code> verwendet werden um alte Logfiles zu löschen.
 
 
== Verwenden von UndefFn, DelayedShutdownFn und ShutdownFn um laufende CoProzesse korrekt zu beenden ==
 
In der [[DevelopmentModuleIntro#X_Undef|UndefFn]], [[DevelopmentModuleIntro#X_DelayedShutdown|DelayedShutdownFn]] und [[DevelopmentModuleIntro#X_Shutdown|ShutdownFn]] des Moduls muß sichergestellt werden, dass die laufenden externen Prozesse sauber beendet werden.  


<u>Beispiel</u>
<u>Beispiel</u>

Version vom 25. Januar 2019, 19:27 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Dieser Artikel soll Hinweise und Best Practices im Umgang mit dem Modul CoProcess.pm und den daraus bereitgestellten Funktionen bieten.

CoProcess.pm enthält eine Sammlung von Routinen um das Ausführen permanent laufender, externen Hilfsprozesse aus FHEM zu vereinfachen. Hierzu gehören:

  • Starten und Stoppen
  • Überwachen und automatisch am Laufen halten
  • Automatisch bei FHEM Start und Stop
  • jeder Zeit manuell
  • lokales oder entferntes Starten per SSH
  • Umleiten von STDOUT und STDERR des Prozesses ins FHEM log oder in ein separates Logfile
  • Rotieren und löschen dieses Logfiles nach FHEM Konventionen
  • status Readings


Allgemein

Das Modul CoProcess.pm wurde entwickelt, um in die Kontrolle ständig laufender externer Hilfsprozesse zu vereinfachen.


Benutzung

Vorbereitung

  • Um die CoProcess Routinen zu verwenden werden diese mit use CoProcess; eingebunden.
  • Danach müßen im Device-Hash Information zum externen Prozess hinterlegt werden. Dies geschieht z.b. in der DefineFn:
 $hash->{CoProcess} = {  name => 'alexaFHEM',
                         cmdFn => 'alexa_getCMD',
                      };
Parameter Optional Beispiel Beschreibung
name nein 'alexaFHEM' Ein Name für diese CoProcess Klasse. Wird verendet um Defaults für Reading- und Attribut-Namen zu erzeugen.
cmdFn nein 'alexa_getCMD' Der Name der Perlfunktion, die die komplette Kommandozeile des zu startenden Prozesses liefert. Wird mit dem Device-Hash als Parameter aufgerufen. Kann undef zurückliefen wenn nichts gestartet werden soll oder kann.
  • Das Modul muss eine ReadFn Implementieren in der CoProcess::readFn($hash) aufgerufen wird.


Starten und Stoppen

 CoProcess::start($)
 CoProcess::stop($)
 CoProcess::terminate($)

Logfile handling

Lesen und Schreiben

 CoProcess::readFn($)

Muß in der ReadFn des Moduls verwendet werden um

Relevante Internals

Internal Optional Beschreibung
logfile ja Muster für den Logfile Namen. Bei FHEM wird Siehe commandref/FileLog. Beispiel: ./log/alexa-%Y-%m-%d.log. Bei FHEM wird das Standard FHEM Logfile verwendet. Wenn nicht gesetzt werden die Prozess ausgaben nicht automatisch geloggt.
currentlogfile - Wird von CoProcess automatisch auf den Namen des Aktuellen Logfiles gesetzt wenn logfile verwendet wird.
log - Filehandle des offenen Logfiles.
PID - Enthält die PID des laufenden Prozesses.
FH - Enthält den Filehandle um dem Prozess zu kommunizieren. Zum lesen sollte CoProcess::readFn($) verwendet werden.

Relevante Attribute

Im FHEM-Device das CoProcess mit einem Logfile verwendet kann das nrarchive verwendet werden um alte Logfiles zu löschen.


Verwenden von UndefFn, DelayedShutdownFn und ShutdownFn um laufende CoProzesse korrekt zu beenden

In der UndefFn, DelayedShutdownFn und ShutdownFn des Moduls muß sichergestellt werden, dass die laufenden externen Prozesse sauber beendet werden.

Beispiel

sub
alexa_Undefine($$) {
  my ($hash, $name) = @_;
      
  if( $hash->{PID} ) {
    $hash->{undefine} = 1;
    $hash->{undefine} = $hash->{CL} if( $hash->{CL} );
      
    $hash->{reason} = 'delete';
    CoProcess::stop($hash);
      
    return "$name will be deleted after alexa-fhem has stopped or after 5 seconds. whatever comes first.";
  }   
      
  delete $modules{$hash->{TYPE}}{defptr};
      
  return undef;
}
sub
alexa_DelayedShutdownFn($){  
  my ($hash) = @_;
  
  if( $hash->{PID} ) {
    $hash->{shutdown} = 1;
    $hash->{shutdown} = $hash->{CL} if( $hash->{CL} );
  
    $hash->{reason} = 'shutdown';
    CoProcess::stop($hash);
  
    return 1;
  }
  
  return undef;
}  
sub
alexa_Shutdown($){
  my ($hash) = @_;
  
  CoProcess::terminate($hash);
  
  delete $modules{$hash->{TYPE}}{defptr};
  
  return undef;
}  


Anzeige der laufenden CoProzesse

Mit dem FHEM-Befehl coprocessinfo lassen sich die laufenden CoProzesse anzeigen.

Module, die CoProcess.pm verwenden

Folgende Module verwenden aktuell CoProcess.pm um parallel laufende Prozesse zu steuern:

  • 30_tradfri.pm
  • 39_alexa.pm
  • 39_gassistant.pm
  • 39_siri.pm