CoProcess

Aus FHEMWiki
Version vom 25. Januar 2019, 10:29 Uhr von Justme (Diskussion | Beiträge) (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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)


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

$hash->{CoProccess}
 name
 cmdFn
$hash->{logfile}
$hash->{currentlogfile}
nrarchive
CoProcess::start
CoProcess::stop
CoProcess::terminate


Einschränkungen

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.

Daher muss in der UndefFn, DelayedShutdownFn und ShutdownFn des Moduls sichergestellt werden, dass ein laufender BlockingCall beendet wird.

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