]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Task-Server: Alarm-Signal während Ausführung ignorieren, beim Schlafen aufwachen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 4 Jan 2016 14:02:55 +0000 (15:02 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 4 Jan 2016 14:02:55 +0000 (15:02 +0100)
Über die Oberfläche kann man den Task-Server aufwecken. Doof nur, wenn
der momentan gerade einen Job ausführt, dann wird der Task-Server
nämlich gekillt.

Generell soll SIGALRM so behandelt werden, dass der Server aufgeweckt
ist, wenn er gerade schläft, und ansonsten soll das Signal komplett
ignoriert werden.

Daher wird es jetzt am Anfang jedes Durchlaufs auf IGNORE gesetzt. Auch
im Signal-Handler für das Aufwecken muss das Signal als erstes wieder
ignoriert werden, weil es ansonsten eine Zeitspanne gibt, in der der
Signal-Handler mehrfach aufgerufen werden kann, und dann stirbt der
Task-Server. Forçierbar z.B. mit:

for i in {1..100}; do
  kill -ALRM <PID-des-Task-Servers>
done

scripts/task_server.pl

index 47fe59510046fb8c81d41e31c378a7a08b7f111b..2fd93de0f88dc6d689cc9e07fb8554d39be36611 100755 (executable)
@@ -274,6 +274,8 @@ sub run_once_for_all_clients {
 
 sub gd_run {
   while (1) {
+    $SIG{'ALRM'} = 'IGNORE';
+
     run_once_for_all_clients();
 
     debug("Sleeping");
@@ -282,7 +284,8 @@ sub gd_run {
 
     my $seconds = 60 - (localtime)[0];
     if (!eval {
-      local $SIG{'ALRM'} = sub {
+      $SIG{'ALRM'} = sub {
+        $SIG{'ALRM'} = 'IGNORE';
         debug("Got woken up by SIGALRM");
         die "Alarm!\n"
       };