mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.8 KiB
101 lines
3.8 KiB
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
|
|
|
<section id="shutdown" xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
<sectioninfo>
|
|
<revhistory>
|
|
<revision>
|
|
<revnumber>$Revision$</revnumber>
|
|
<date>$Date$</date>
|
|
</revision>
|
|
</revhistory>
|
|
</sectioninfo>
|
|
|
|
<title>The Server Showdown</title>
|
|
<para>
|
|
The server shutdown can be triggered by sending a signal to the
|
|
server. The server will behave differently upon receiving various types
|
|
of signals, here is a brief summary:
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
<emphasis>SIGINT, SIGPIPE, SIGTERM, SIGCHLD</emphasis> will terminate the server.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
<emphasis>SIGUSR1</emphasis> will print statistics and let the server continue.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
<emphasis>SIGHUP, SIGUSR2</emphasis> will be ignored.
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
There is only one common signal handler for all signals - function
|
|
<function>sig_usr</function> in file <filename>main.c</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
In normal mode of operation (<varname>dont_fork</varname> variable is
|
|
not set), the main server is not processing any requests, it calls
|
|
<function>pause</function> function and will be waiting for signals
|
|
only. What happens when a signal arrives is shown in the previous
|
|
paragraph.
|
|
</para>
|
|
<para>
|
|
When in normal mode (<varname>dont_fork</varname> is not set), the
|
|
signal handler of the main process will only store number of the signal
|
|
received. All the processing logic will be executed by the main
|
|
process outside the signal handler (function
|
|
<function>handle_sigs</function>) The function will be called
|
|
immediately after the signal handler finish. The main process usually
|
|
does some cleanup and running such things outside the signal handler is
|
|
much more safe than doing it from the handler itself. Children only
|
|
print statistics and exit or ignore the signal completely, that is
|
|
quite safe and can be done directly from the signal handler of
|
|
children.
|
|
</para>
|
|
<para>
|
|
When <varname>dont_fork</varname> is set, all the cleanup will be done
|
|
directly from the signal handler, because there is only one process -
|
|
the main process. This is not so safe as the previous case, but this
|
|
mode should be used for debugging only and such shortcoming doesn't
|
|
harm in that case.
|
|
</para>
|
|
<para>
|
|
Upon receipt of SIGINT, SIGPIPE or SIGTERM
|
|
<function>destroy_modules</function> will be called. Each module may
|
|
register so-called <function>destroy</function> function if it needs to
|
|
do some cleanup when the server is terminating (flush of cache to disk
|
|
for example). <function>destroy_modules</function> will call destroy
|
|
function of all loaded modules.
|
|
</para>
|
|
<para>
|
|
If you need to terminate the server and all of its children, the best
|
|
way how to do it is to send SIGTERM to the main process, the main
|
|
process will in turn send the same signal to its children.
|
|
</para>
|
|
<para>
|
|
The main process and its children are in the same process
|
|
group. Therefore the main process can kill all its children simply by
|
|
sending a signal to pid 0, sending to pid 0 will send the signal to all
|
|
processes in the same process group as the sending process. This is how
|
|
the main process will terminate all children when it is going to shut
|
|
down.
|
|
</para>
|
|
<para>
|
|
If one child exited during normal operation, the whole server will be
|
|
shut down. This is better than let the server continue - a dead child
|
|
might hold a lock and that could block the whole server, such situation
|
|
cannot be avoided easily. Instead of that it is better to shutdown the
|
|
whole server and let it restart.
|
|
</para>
|
|
|
|
</section> <!-- server-shutdown -->
|