diff --git a/configure b/configure index eefe5de..d8f6313 100755 --- a/configure +++ b/configure @@ -140,6 +140,7 @@ For better control, use the options below. --with-rtcdevice=PATH Specify default path to RTC device [/dev/rtc] --with-sendmail=PATH Path to sendmail binary [/usr/lib/sendmail] --enable-debug Enable debugging support + --without-libsystemd Don't use libsystemd even if it is available Fine tuning of the installation directories: --sysconfdir=DIR chrony.conf location [/etc] @@ -259,6 +260,7 @@ default_hwclockfile="" default_pidfile="/var/run/chrony/chronyd.pid" default_rtcdevice="/dev/rtc" mail_program="/usr/lib/sendmail" +try_libsystemd=1 for option do @@ -395,6 +397,9 @@ do --without-gnutls ) try_gnutls=0 ;; + --without-libsystemd ) + try_libsystemd=0 + ;; --host-system=* ) OPERATINGSYSTEM=`echo $option | sed -e 's/^.*=//;'` ;; @@ -589,6 +594,7 @@ if ! test_executable "pkg-config" $PKG_CONFIG --version; then try_nettle=0 try_nss=0 try_gnutls=0 + try_libsystemd=0 fi if test_code '64-bit time_t' 'time.h' '' '' ' @@ -1045,6 +1051,19 @@ if [ $feat_ntp = "1" ] && [ $feat_nts = "1" ] && [ $try_gnutls = "1" ]; then fi fi +if [ $try_libsystemd = "1" ]; then + test_cflags="`pkg_config --cflags libsystemd`" + test_link="`pkg_config --libs libsystemd`" + if test_code 'libsystemd' 'systemd/sd-daemon.h' \ + "$test_cflags" "$test_link" \ + 'sd_notify(0, "READY=1");' + then + LIBS="$LIBS $test_link" + MYCPPFLAGS="$MYCPPFLAGS $test_cflags" + add_def FEAT_LIBSYSTEMD + fi +fi + if [ $use_pthread = "1" ]; then MYCFLAGS="$MYCFLAGS -pthread" fi @@ -1114,7 +1133,7 @@ add_def MAIL_PROGRAM "\"$mail_program\"" common_features="`get_features SECHASH IPV6 DEBUG`" chronyc_features="`get_features READLINE`" -chronyd_features="`get_features CMDMON NTP REFCLOCK RTC PRIVDROP SCFILTER SIGND ASYNCDNS NTS`" +chronyd_features="`get_features CMDMON NTP REFCLOCK RTC PRIVDROP SCFILTER SIGND ASYNCDNS NTS LIBSYSTEMD`" add_def CHRONYC_FEATURES "\"$chronyc_features $common_features\"" add_def CHRONYD_FEATURES "\"$chronyd_features $common_features\"" echo "Features : $chronyd_features $chronyc_features $common_features" diff --git a/doc/installation.adoc b/doc/installation.adoc index b683911..7465f5d 100644 --- a/doc/installation.adoc +++ b/doc/installation.adoc @@ -35,6 +35,7 @@ to enable optional features: * timepps.h header: PPS reference clock * Asciidoctor: documentation in HTML format * Bash: test suite +* libsystemd: signal readiness to systemd via `sd_notify()` (`LIBSYSTEMD`) The following programs are needed when building `chrony` from the git repository instead of a released tar file: @@ -104,6 +105,15 @@ If development files for the editline library are available, `chronyc` will be built with line editing support. If you don't want this, specify the `--disable-readline` flag to `configure`. +If development files for the libsystemd library are available, `chronyd` will +be built with support for signaling readiness to systemd via `sd_notify()`. +When this is enabled, `chronyd` in a systemd unit file can be called with the +`-n` option to avoid forking in the background, and with `pidfile /` set in the +`chronyd` configuration file to avoid writing/checking the PID file. This will +let systemd do the full lifecycle tracking and management of `chronyd`, without +race conditions. If you don't want to enable the support, specify the +`--without-libsystemd` flag to `configure`. + If a `timepps.h` header is available (e.g. from the http://linuxpps.org[LinuxPPS project]), `chronyd` will be built with PPS API reference clock driver. If the header is installed in a location that isn't diff --git a/main.c b/main.c index 88ada20..ba952e2 100644 --- a/main.c +++ b/main.c @@ -59,6 +59,10 @@ #include "tempcomp.h" #include "util.h" +#ifdef FEAT_LIBSYSTEMD +#include +#endif + /* ================================================== */ /* Set when the initialisation chain has been completed. Prevents finalisation @@ -698,10 +702,20 @@ int main post_init_rtc_hook(NULL); } +#ifdef FEAT_LIBSYSTEMD + if (nofork) + sd_notify(0, "READY=1"); +#endif + /* The program normally runs under control of the main loop in the scheduler. */ SCH_MainLoop(); +#ifdef FEAT_LIBSYSTEMD + if (nofork) + sd_notify(0, "STOPPING=1"); +#endif + LOG(LOGS_INFO, "chronyd exiting"); MAI_CleanupAndExit();