From: Moritz Bunkus Date: Mon, 4 Jan 2016 14:02:55 +0000 (+0100) Subject: Task-Server: Alarm-Signal während Ausführung ignorieren, beim Schlafen aufwachen X-Git-Tag: release-3.4.1~495 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=cc7356a7309367cfe5de5caa5f9d50d41e144880;p=kivitendo-erp.git Task-Server: Alarm-Signal während Ausführung ignorieren, beim Schlafen aufwachen Ü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 done --- diff --git a/scripts/task_server.pl b/scripts/task_server.pl index 47fe59510..2fd93de0f 100755 --- a/scripts/task_server.pl +++ b/scripts/task_server.pl @@ -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" };