From cc7356a7309367cfe5de5caa5f9d50d41e144880 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 4 Jan 2016 15:02:55 +0100 Subject: [PATCH] =?utf8?q?Task-Server:=20Alarm-Signal=20w=C3=A4hrend=20Aus?= =?utf8?q?f=C3=BChrung=20ignorieren,=20beim=20Schlafen=20aufwachen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Ü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 --- scripts/task_server.pl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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" }; -- 2.20.1