From a7b52ad679e6a58a9351a26e198eee70067b000f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Mon, 13 Apr 2015 18:47:06 +0200
Subject: kernel: Add gen_event signal server and default handler
---
lib/kernel/src/Makefile | 1 +
lib/kernel/src/erl_signal_handler.erl | 47 +++++++++++++++++++++++++++++++++++
lib/kernel/src/kernel.app.src | 1 +
lib/kernel/src/kernel.erl | 13 +++++++++-
4 files changed, 61 insertions(+), 1 deletion(-)
create mode 100644 lib/kernel/src/erl_signal_handler.erl
(limited to 'lib')
diff --git a/lib/kernel/src/Makefile b/lib/kernel/src/Makefile
index 2b72f78dcf..2a89faaf13 100644
--- a/lib/kernel/src/Makefile
+++ b/lib/kernel/src/Makefile
@@ -71,6 +71,7 @@ MODULES = \
erl_distribution \
erl_epmd \
erl_reply \
+ erl_signal_handler \
erts_debug \
error_handler \
error_logger \
diff --git a/lib/kernel/src/erl_signal_handler.erl b/lib/kernel/src/erl_signal_handler.erl
new file mode 100644
index 0000000000..6bd8f992a7
--- /dev/null
+++ b/lib/kernel/src/erl_signal_handler.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2013. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(erl_signal_handler).
+-behaviour(gen_event).
+-export([init/1, format_status/2,
+ handle_event/2, handle_call/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+-record(state,{}).
+
+init(_Args) ->
+ {ok, #state{}}.
+
+handle_event(_SignalMsg, S) ->
+ {ok, S}.
+
+handle_info(_Info, S) ->
+ {ok, S}.
+
+handle_call(_Request, S) ->
+ {ok, ok, S}.
+
+format_status(_Opt, [_Pdict,_S]) ->
+ ok.
+
+code_change(_OldVsn, S, _Extra) ->
+ {ok, S}.
+
+terminate(_Args, _S) ->
+ ok.
diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src
index 4d08a55c7c..25e4ddd95c 100644
--- a/lib/kernel/src/kernel.app.src
+++ b/lib/kernel/src/kernel.app.src
@@ -34,6 +34,7 @@
erl_boot_server,
erl_distribution,
erl_reply,
+ erl_signal_handler,
error_handler,
error_logger,
file,
diff --git a/lib/kernel/src/kernel.erl b/lib/kernel/src/kernel.erl
index 3d0ef81318..59eca242b1 100644
--- a/lib/kernel/src/kernel.erl
+++ b/lib/kernel/src/kernel.erl
@@ -32,6 +32,14 @@
start(_, []) ->
case supervisor:start_link({local, kernel_sup}, kernel, []) of
{ok, Pid} ->
+ %% add signal handler
+ case whereis(erl_signal_server) of
+ %% in case of minimal mode
+ undefined -> ok;
+ _ ->
+ ok = gen_event:add_handler(erl_signal_server, erl_signal_handler, [])
+ end,
+ %% add error handler
Type = get_error_logger_type(),
case error_logger:swap_handler(Type) of
ok -> {ok, Pid, []};
@@ -131,6 +139,9 @@ init([]) ->
permanent, 2000, worker, [inet_db]},
NetSup = {net_sup, {erl_distribution, start_link, []},
permanent, infinity, supervisor,[erl_distribution]},
+ SigSrv = #{id => erl_signal_server,
+ start => {gen_event, start_link, [{local, erl_signal_server}]},
+ type => worker, restart => permanent, shutdown => 2000, modules => dynamic},
DistAC = start_dist_ac(),
Timer = start_timer(),
@@ -141,7 +152,7 @@ init([]) ->
permanent, infinity, supervisor, [?MODULE]},
{ok, {SupFlags,
[Code, Rpc, Global, InetDb | DistAC] ++
- [NetSup, Glo_grp, File,
+ [NetSup, Glo_grp, File, SigSrv,
StdError, User, Config, SafeSupervisor] ++ Timer}}
end;
init(safe) ->
--
cgit v1.2.3
From 40c82769def0cfa59e75669ff1c6fc4abcecd764 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Thu, 15 Dec 2016 18:07:13 +0100
Subject: erts: Handle SIGTERM via signal service instead
---
lib/kernel/src/erl_signal_handler.erl | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'lib')
diff --git a/lib/kernel/src/erl_signal_handler.erl b/lib/kernel/src/erl_signal_handler.erl
index 6bd8f992a7..04130eac66 100644
--- a/lib/kernel/src/erl_signal_handler.erl
+++ b/lib/kernel/src/erl_signal_handler.erl
@@ -28,6 +28,10 @@
init(_Args) ->
{ok, #state{}}.
+handle_event(sigterm, S) ->
+ error_logger:info_msg("SIGTERM received - shutting down~n"),
+ ok = init:stop(),
+ {ok, S};
handle_event(_SignalMsg, S) ->
{ok, S}.
--
cgit v1.2.3
From 2d3bf84d8167b50728b0a5411a4e2dfa71d52c10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Fri, 16 Dec 2016 12:24:13 +0100
Subject: erts: Handle SIGUSR1 via signal service instead
---
lib/kernel/src/erl_signal_handler.erl | 3 +++
1 file changed, 3 insertions(+)
(limited to 'lib')
diff --git a/lib/kernel/src/erl_signal_handler.erl b/lib/kernel/src/erl_signal_handler.erl
index 04130eac66..43cc307ffd 100644
--- a/lib/kernel/src/erl_signal_handler.erl
+++ b/lib/kernel/src/erl_signal_handler.erl
@@ -28,6 +28,9 @@
init(_Args) ->
{ok, #state{}}.
+handle_event(sigusr1, S) ->
+ erlang:halt("Received SIGUSR1"),
+ {ok, S};
handle_event(sigterm, S) ->
error_logger:info_msg("SIGTERM received - shutting down~n"),
ok = init:stop(),
--
cgit v1.2.3
From 120f04387ade07ef5b8b6d20a04de7d21e0c40ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Thu, 5 Jan 2017 17:17:52 +0100
Subject: erts: Use generic signal handler
---
lib/kernel/src/erl_signal_handler.erl | 3 +++
1 file changed, 3 insertions(+)
(limited to 'lib')
diff --git a/lib/kernel/src/erl_signal_handler.erl b/lib/kernel/src/erl_signal_handler.erl
index 43cc307ffd..8f924d2adc 100644
--- a/lib/kernel/src/erl_signal_handler.erl
+++ b/lib/kernel/src/erl_signal_handler.erl
@@ -31,6 +31,9 @@ init(_Args) ->
handle_event(sigusr1, S) ->
erlang:halt("Received SIGUSR1"),
{ok, S};
+handle_event(sigquit, S) ->
+ erlang:halt(),
+ {ok, S};
handle_event(sigterm, S) ->
error_logger:info_msg("SIGTERM received - shutting down~n"),
ok = init:stop(),
--
cgit v1.2.3
From d4bd17da9759af54227891a90d9fb83d5bfe6d7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Tue, 24 Jan 2017 10:59:30 +0100
Subject: erts: Use os module instead of erts_internal for set_signal/2
* Add specs
* Change return signature to 'ok' instead of 'true'
---
lib/kernel/src/os.erl | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
(limited to 'lib')
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index f8519d3a5e..c3ffcb3f70 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -29,7 +29,7 @@
-export([getenv/0, getenv/1, getenv/2, getpid/0,
perf_counter/0, perf_counter/1,
- putenv/2, system_time/0, system_time/1,
+ putenv/2, set_signal/2, system_time/0, system_time/1,
timestamp/0, unsetenv/1]).
-spec getenv() -> [string()].
@@ -104,6 +104,15 @@ timestamp() ->
unsetenv(_) ->
erlang:nif_error(undef).
+-spec set_signal(Signal, Option) -> 'ok' when
+ Signal :: 'sighup' | 'sigquit' | 'sigabrt' | 'sigalrm' |
+ 'sigterm' | 'sigusr1' | 'sigusr2' | 'sigchld' |
+ 'sigstop' | 'sigtstp',
+ Option :: 'default' | 'handle' | 'ignore'.
+
+set_signal(_Signal, _Option) ->
+ erlang:nif_error(undef).
+
%%% End of BIFs
-spec type() -> {Osfamily, Osname} when
--
cgit v1.2.3
From 1409b6ae110f60c410e83d1923dd59ae3659a887 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
Date: Wed, 1 Feb 2017 16:44:50 +0100
Subject: kernel: Document signal server
---
lib/kernel/doc/src/kernel_app.xml | 59 +++++++++++++++++++++++++++++++++++++--
lib/kernel/doc/src/os.xml | 31 ++++++++++++++++++--
2 files changed, 84 insertions(+), 6 deletions(-)
(limited to 'lib')
diff --git a/lib/kernel/doc/src/kernel_app.xml b/lib/kernel/doc/src/kernel_app.xml
index df681a505f..c581fa9d1e 100644
--- a/lib/kernel/doc/src/kernel_app.xml
+++ b/lib/kernel/doc/src/kernel_app.xml
@@ -11,7 +11,7 @@
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
@@ -19,7 +19,7 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-
+
kernel
@@ -57,6 +57,60 @@
error_logger(3).
+
+ OS Signal Event Handler
+ Asynchronous OS signals may be subscribed to via the Kernel applications event manager
+ (see OTP Design Principles and
+ gen_event(3)) registered as erl_signal_server.
+ A default signal handler is installed which handles the following signals:
+
+ sigusr1
+ The default handler will halt Erlang and produce a crashdump
+ with slogan "Received SIGUSR1".
+ This is equivalent to calling erlang:halt("Received SIGUSR1").
+
+
+ sigquit
+ The default handler will halt Erlang immediately.
+ This is equivalent to calling erlang:halt().
+
+
+ sigterm
+ The default handler will terminate Erlang normally.
+ This is equivalent to calling init:stop().
+
+
+
+
+ Events
+ Any event handler added to erl_signal_server must handle the following events.
+
+ sighup
+ Hangup detected on controlling terminal or death of controlling process
+ sigquit
+ Quit from keyboard
+ sigabrt
+ Abort signal from abort
+ sigalrm
+ Timer signal from alarm
+ sigterm
+ Termination signal
+ sigusr1
+ User-defined signal 1
+ sigusr2
+ User-defined signal 2
+ sigchld
+ Child process stopped or terminated
+ sigstop
+ Stop process
+ sigtstp
+ Stop typed at terminal
+
+
+ Setting OS signals are described in os:set_signal/2.
+
+
+
Configuration
The following configuration parameters are defined for the Kernel
@@ -405,4 +459,3 @@ MaxT = TickTime + TickTime / 4
timer(3)
-
diff --git a/lib/kernel/doc/src/os.xml b/lib/kernel/doc/src/os.xml
index 739ac35d2a..6ba69d12a3 100644
--- a/lib/kernel/doc/src/os.xml
+++ b/lib/kernel/doc/src/os.xml
@@ -11,7 +11,7 @@
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
@@ -19,7 +19,7 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-
+
os
@@ -155,6 +155,32 @@ DirOut = os:cmd("dir"), % on Win32 platform
+
+
+ Enables or disables handling of OS signals.
+
+ Enables or disables OS signals.
+ Each signal my be set to one of the following options:
+
+ ignore
+ -
+ This signal will be ignored.
+
+
+ default
+ -
+ This signal will use the default signal handler for the operating system.
+
+
+ handle
+ -
+ This signal will notify erl_signal_server when it is received by
+ the Erlang runtime system.
+
+
+
+
+
Current OS system time.
@@ -296,4 +322,3 @@ calendar:now_to_universal_time(TS),
-
--
cgit v1.2.3