chiark / gitweb /
man: add missing headers to glib-event-glue.c
[elogind.git] / man / sd_notify.xml
1 <?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
2 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4
5 <!--
6   SPDX-License-Identifier: LGPL-2.1+
7
8   This file is part of elogind.
9
10   Copyright 2010 Lennart Poettering
11
12   elogind is free software; you can redistribute it and/or modify it
13   under the terms of the GNU Lesser General Public License as published by
14   the Free Software Foundation; either version 2.1 of the License, or
15   (at your option) any later version.
16
17   elogind is distributed in the hope that it will be useful, but
18   WITHOUT ANY WARRANTY; without even the implied warranty of
19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20   Lesser General Public License for more details.
21
22   You should have received a copy of the GNU Lesser General Public License
23   along with elogind; If not, see <http://www.gnu.org/licenses/>.
24 -->
25
26 <refentry id="sd_notify"
27   xmlns:xi="http://www.w3.org/2001/XInclude">
28
29   <refentryinfo>
30     <title>sd_notify</title>
31     <productname>elogind</productname>
32
33     <authorgroup>
34       <author>
35         <contrib>Developer</contrib>
36         <firstname>Lennart</firstname>
37         <surname>Poettering</surname>
38         <email>lennart@poettering.net</email>
39       </author>
40     </authorgroup>
41   </refentryinfo>
42
43   <refmeta>
44     <refentrytitle>sd_notify</refentrytitle>
45     <manvolnum>3</manvolnum>
46   </refmeta>
47
48   <refnamediv>
49     <refname>sd_notify</refname>
50     <refname>sd_notifyf</refname>
51     <refname>sd_pid_notify</refname>
52     <refname>sd_pid_notifyf</refname>
53     <refname>sd_pid_notify_with_fds</refname>
54     <refpurpose>Notify service manager about start-up completion and other service status changes</refpurpose>
55   </refnamediv>
56
57   <refsynopsisdiv>
58     <funcsynopsis>
59       <funcsynopsisinfo>#include &lt;elogind/sd-daemon.h&gt;</funcsynopsisinfo>
60
61       <funcprototype>
62         <funcdef>int <function>sd_notify</function></funcdef>
63         <paramdef>int <parameter>unset_environment</parameter></paramdef>
64         <paramdef>const char *<parameter>state</parameter></paramdef>
65       </funcprototype>
66
67       <funcprototype>
68         <funcdef>int <function>sd_notifyf</function></funcdef>
69         <paramdef>int <parameter>unset_environment</parameter></paramdef>
70         <paramdef>const char *<parameter>format</parameter></paramdef>
71         <paramdef>…</paramdef>
72       </funcprototype>
73
74       <funcprototype>
75         <funcdef>int <function>sd_pid_notify</function></funcdef>
76         <paramdef>pid_t <parameter>pid</parameter></paramdef>
77         <paramdef>int <parameter>unset_environment</parameter></paramdef>
78         <paramdef>const char *<parameter>state</parameter></paramdef>
79       </funcprototype>
80
81       <funcprototype>
82         <funcdef>int <function>sd_pid_notifyf</function></funcdef>
83         <paramdef>pid_t <parameter>pid</parameter></paramdef>
84         <paramdef>int <parameter>unset_environment</parameter></paramdef>
85         <paramdef>const char *<parameter>format</parameter></paramdef>
86         <paramdef>…</paramdef>
87       </funcprototype>
88
89       <funcprototype>
90         <funcdef>int <function>sd_pid_notify_with_fds</function></funcdef>
91         <paramdef>pid_t <parameter>pid</parameter></paramdef>
92         <paramdef>int <parameter>unset_environment</parameter></paramdef>
93         <paramdef>const char *<parameter>state</parameter></paramdef>
94         <paramdef>const int *<parameter>fds</parameter></paramdef>
95         <paramdef>unsigned <parameter>n_fds</parameter></paramdef>
96       </funcprototype>
97     </funcsynopsis>
98   </refsynopsisdiv>
99
100   <refsect1>
101     <title>Description</title>
102     <para><function>sd_notify()</function> may be called by a service
103     to notify the service manager about state changes. It can be used
104     to send arbitrary information, encoded in an
105     environment-block-like string. Most importantly, it can be used for
106     start-up completion notification.</para>
107
108     <para>If the <parameter>unset_environment</parameter> parameter is
109     non-zero, <function>sd_notify()</function> will unset the
110     <varname>$NOTIFY_SOCKET</varname> environment variable before
111     returning (regardless of whether the function call itself
112     succeeded or not). Further calls to
113     <function>sd_notify()</function> will then fail, but the variable
114     is no longer inherited by child processes.</para>
115
116     <para>The <parameter>state</parameter> parameter should contain a
117     newline-separated list of variable assignments, similar in style
118     to an environment block. A trailing newline is implied if none is
119     specified. The string may contain any kind of variable
120     assignments, but the following shall be considered
121     well-known:</para>
122
123     <variablelist>
124       <varlistentry>
125         <term>READY=1</term>
126
127         <listitem><para>Tells the service manager that service startup is finished, or the service finished loading its
128         configuration. This is only used by elogind if the service definition file has <varname>Type=notify</varname>
129         set. Since there is little value in signaling non-readiness, the only value services should send is
130         <literal>READY=1</literal> (i.e.  <literal>READY=0</literal> is not defined).</para></listitem>
131       </varlistentry>
132
133       <varlistentry>
134         <term>RELOADING=1</term>
135
136         <listitem><para>Tells the service manager that the service is
137         reloading its configuration. This is useful to allow the
138         service manager to track the service's internal state, and
139         present it to the user. Note that a service that sends this
140         notification must also send a <literal>READY=1</literal>
141         notification when it completed reloading its
142         configuration. Reloads are propagated in the same way as they
143         are when initiated by the user.</para></listitem>
144       </varlistentry>
145
146       <varlistentry>
147         <term>STOPPING=1</term>
148
149         <listitem><para>Tells the service manager that the service is
150         beginning its shutdown. This is useful to allow the service
151         manager to track the service's internal state, and present it
152         to the user.</para></listitem>
153       </varlistentry>
154
155       <varlistentry>
156         <term>STATUS=…</term>
157
158         <listitem><para>Passes a single-line UTF-8 status string back
159         to the service manager that describes the service state. This
160         is free-form and can be used for various purposes: general
161         state feedback, fsck-like programs could pass completion
162         percentages and failing programs could pass a human-readable
163         error message. Example: <literal>STATUS=Completed 66% of file
164         system check…</literal></para></listitem>
165       </varlistentry>
166
167       <varlistentry>
168         <term>ERRNO=…</term>
169
170         <listitem><para>If a service fails, the errno-style error
171         code, formatted as string. Example: <literal>ERRNO=2</literal>
172         for ENOENT.</para></listitem>
173       </varlistentry>
174
175       <varlistentry>
176         <term>BUSERROR=…</term>
177
178         <listitem><para>If a service fails, the D-Bus error-style
179         error code. Example:
180         <literal>BUSERROR=org.freedesktop.DBus.Error.TimedOut</literal></para></listitem>
181       </varlistentry>
182
183       <varlistentry>
184         <term>MAINPID=…</term>
185
186         <listitem><para>The main process ID (PID) of the service, in
187         case the service manager did not fork off the process itself.
188         Example: <literal>MAINPID=4711</literal></para></listitem>
189       </varlistentry>
190
191       <varlistentry>
192         <term>WATCHDOG=1</term>
193
194         <listitem><para>Tells the service manager to update the
195         watchdog timestamp. This is the keep-alive ping that services
196         need to issue in regular intervals if
197         <varname>WatchdogSec=</varname> is enabled for it. See
198         <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
199         for information how to enable this functionality and
200         <citerefentry><refentrytitle>sd_watchdog_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>
201         for the details of how the service can check whether the
202         watchdog is enabled. </para></listitem>
203       </varlistentry>
204
205       <varlistentry>
206         <term>WATCHDOG_USEC=…</term>
207
208         <listitem><para>Reset <varname>watchdog_usec</varname> value during runtime.
209         Notice that this is not available when using <function>sd_event_set_watchdog()</function>
210         or <function>sd_watchdog_enabled()</function>.
211         Example : <literal>WATCHDOG_USEC=20000000</literal></para></listitem>
212       </varlistentry>
213
214       <varlistentry>
215         <term>EXTEND_TIMEOUT_USEC=…</term>
216
217         <listitem><para>Tells the service manager to extend the startup, runtime or shutdown service timeout
218         corresponding the current state. The value specified is a time in microseconds during which the service must
219         send a new message. A service timeout will occur if the message isn't received, but only if the runtime of the
220         current state is beyond the original maximium times of <varname>TimeoutStartSec=</varname>, <varname>RuntimeMaxSec=</varname>,
221         and <varname>TimeoutStopSec=</varname>.
222         See <citerefentry><refentrytitle>elogind.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
223         for effects on the service timeouts.</para></listitem>
224       </varlistentry>
225
226       <varlistentry>
227         <term>FDSTORE=1</term>
228
229         <listitem><para>Stores additional file descriptors in the service manager. File descriptors sent this way will
230         be maintained per-service by the service manager and will later be handed back using the usual file descriptor
231         passing logic at the next invocation of the service, see
232         <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>.  This is
233         useful for implementing services that can restart after an explicit request or a crash without losing
234         state. Any open sockets and other file descriptors which should not be closed during the restart may be stored
235         this way. Application state can either be serialized to a file in <filename>/run</filename>, or better, stored
236         in a <citerefentry><refentrytitle>memfd_create</refentrytitle><manvolnum>2</manvolnum></citerefentry> memory
237         file descriptor. Note that the service manager will accept messages for a service only if its
238         <varname>FileDescriptorStoreMax=</varname> setting is non-zero (defaults to zero, see
239         <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>). If file
240         descriptors sent are pollable (see
241         <citerefentry><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>), then any
242         <constant>EPOLLHUP</constant> or <constant>EPOLLERR</constant> event seen on them will result in their
243         automatic removal from the store. Multiple arrays of file descriptors may be sent in separate messages, in
244         which case the arrays are combined. Note that the service manager removes duplicate (pointing to the same
245         object) file descriptors before passing them to the service. Use <function>sd_pid_notify_with_fds()</function>
246         to send messages with <literal>FDSTORE=1</literal>, see below.</para></listitem>
247       </varlistentry>
248
249       <varlistentry>
250         <term>FDSTOREREMOVE=1</term>
251
252         <listitem><para>Removes file descriptors from the file descriptor store. This field needs to be combined with
253         <varname>FDNAME=</varname> to specify the name of the file descriptors to remove.</para></listitem>
254       </varlistentry>
255
256       <varlistentry>
257         <term>FDNAME=…</term>
258
259         <listitem><para>When used in combination with <varname>FDSTORE=1</varname>, specifies a name for the submitted
260         file descriptors. When used with <varname>FDSTOREREMOVE=1</varname>, specifies the name for the file
261         descriptors to remove. This name is passed to the service during activation, and may be queried using
262         <citerefentry><refentrytitle>sd_listen_fds_with_names</refentrytitle><manvolnum>3</manvolnum></citerefentry>. File
263         descriptors submitted without this field set, will implicitly get the name <literal>stored</literal>
264         assigned. Note that, if multiple file descriptors are submitted at once, the specified name will be assigned to
265         all of them. In order to assign different names to submitted file descriptors, submit them in separate
266         invocations of <function>sd_pid_notify_with_fds()</function>. The name may consist of arbitrary ASCII
267         characters except control characters or <literal>:</literal>. It may not be longer than 255 characters. If a
268         submitted name does not follow these restrictions, it is ignored.</para></listitem>
269       </varlistentry>
270
271     </variablelist>
272
273     <para>It is recommended to prefix variable names that are not
274     listed above with <varname>X_</varname> to avoid namespace
275     clashes.</para>
276
277     <para>Note that elogind will accept status data sent from a
278     service only if the <varname>NotifyAccess=</varname> option is
279     correctly set in the service definition file. See
280     <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
281     for details.</para>
282
283     <para>Note that <function>sd_notify()</function> notifications may be attributed to units correctly only if either
284     the sending process is still around at the time PID 1 processes the message, or if the sending process is
285     explicitly runtime-tracked by the service manager. The latter is the case if the service manager originally forked
286     off the process, i.e. on all processes that match <varname>NotifyAccess=</varname><option>main</option> or
287     <varname>NotifyAccess=</varname><option>exec</option>. Conversely, if an auxiliary process of the unit sends an
288     <function>sd_notify()</function> message and immediately exits, the service manager might not be able to properly
289     attribute the message to the unit, and thus will ignore it, even if
290     <varname>NotifyAccess=</varname><option>all</option> is set for it.</para>
291
292     <para><function>sd_notifyf()</function> is similar to
293     <function>sd_notify()</function> but takes a
294     <function>printf()</function>-like format string plus
295     arguments.</para>
296
297     <para><function>sd_pid_notify()</function> and
298     <function>sd_pid_notifyf()</function> are similar to
299     <function>sd_notify()</function> and
300     <function>sd_notifyf()</function> but take a process ID (PID) to
301     use as originating PID for the message as first argument. This is
302     useful to send notification messages on behalf of other processes,
303     provided the appropriate privileges are available. If the PID
304     argument is specified as 0, the process ID of the calling process
305     is used, in which case the calls are fully equivalent to
306     <function>sd_notify()</function> and
307     <function>sd_notifyf()</function>.</para>
308
309     <para><function>sd_pid_notify_with_fds()</function> is similar to
310     <function>sd_pid_notify()</function> but takes an additional array
311     of file descriptors. These file descriptors are sent along the
312     notification message to the service manager. This is particularly
313     useful for sending <literal>FDSTORE=1</literal> messages, as
314     described above. The additional arguments are a pointer to the
315     file descriptor array plus the number of file descriptors in the
316     array. If the number of file descriptors is passed as 0, the call
317     is fully equivalent to <function>sd_pid_notify()</function>, i.e.
318     no file descriptors are passed. Note that sending file descriptors
319     to the service manager on messages that do not expect them (i.e.
320     without <literal>FDSTORE=1</literal>) they are immediately closed
321     on reception.</para>
322   </refsect1>
323
324   <refsect1>
325     <title>Return Value</title>
326
327     <para>On failure, these calls return a negative errno-style error code. If <varname>$NOTIFY_SOCKET</varname> was
328     not set and hence no status message could be sent, 0 is returned. If the status was sent, these functions return a
329     positive value. In order to support both service managers that implement this scheme and those which do not, it is
330     generally recommended to ignore the return value of this call. Note that the return value simply indicates whether
331     the notification message was enqueued properly, it does not reflect whether the message could be processed
332     successfully. Specifically, no error is returned when a file descriptor is attempted to be stored using
333     <varname>FDSTORE=1</varname> but the service is not actually configured to permit storing of file descriptors (see
334     above).</para>
335   </refsect1>
336
337   <refsect1>
338     <title>Notes</title>
339
340     <xi:include href="libelogind-pkgconfig.xml" xpointer="pkgconfig-text"/>
341
342     <para>These functions send a single datagram with the
343     state string as payload to the <constant>AF_UNIX</constant> socket
344     referenced in the <varname>$NOTIFY_SOCKET</varname> environment
345     variable. If the first character of
346     <varname>$NOTIFY_SOCKET</varname> is <literal>@</literal>, the
347     string is understood as Linux abstract namespace socket. The
348     datagram is accompanied by the process credentials of the sending
349     service, using SCM_CREDENTIALS.</para>
350   </refsect1>
351
352   <refsect1>
353     <title>Environment</title>
354
355     <variablelist class='environment-variables'>
356       <varlistentry>
357         <term><varname>$NOTIFY_SOCKET</varname></term>
358
359         <listitem><para>Set by the service manager for supervised
360         processes for status and start-up completion notification.
361         This environment variable specifies the socket
362         <function>sd_notify()</function> talks to. See above for
363         details.</para></listitem>
364       </varlistentry>
365     </variablelist>
366   </refsect1>
367
368   <refsect1>
369     <title>Examples</title>
370
371     <example>
372       <title>Start-up Notification</title>
373
374       <para>When a service finished starting up, it might issue the
375       following call to notify the service manager:</para>
376
377       <programlisting>sd_notify(0, "READY=1");</programlisting>
378     </example>
379
380     <example>
381       <title>Extended Start-up Notification</title>
382
383       <para>A service could send the following after completing
384       initialization:</para>
385
386       <programlisting>sd_notifyf(0, "READY=1\n"
387         "STATUS=Processing requests…\n"
388         "MAINPID=%lu",
389         (unsigned long) getpid());</programlisting>
390     </example>
391
392     <example>
393       <title>Error Cause Notification</title>
394
395       <para>A service could send the following shortly before exiting, on failure:</para>
396
397       <programlisting>sd_notifyf(0, "STATUS=Failed to start up: %s\n"
398         "ERRNO=%i",
399         strerror(errno),
400         errno);</programlisting>
401     </example>
402
403     <example>
404       <title>Store a File Descriptor in the Service Manager</title>
405
406       <para>To store an open file descriptor in the service manager,
407       in order to continue operation after a service restart without
408       losing state, use <literal>FDSTORE=1</literal>:</para>
409
410       <programlisting>sd_pid_notify_with_fds(0, 0, "FDSTORE=1\nFDNAME=foobar", &amp;fd, 1);</programlisting>
411     </example>
412   </refsect1>
413
414   <refsect1>
415     <title>See Also</title>
416     <para>
417       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
418       <citerefentry><refentrytitle>sd-daemon</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
419       <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
420       <citerefentry><refentrytitle>sd_listen_fds_with_names</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
421       <citerefentry><refentrytitle>sd_watchdog_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
422       <citerefentry><refentrytitle>daemon</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
423       <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
424     </para>
425   </refsect1>
426
427 </refentry>