123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- <?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 -->
|