]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
allow running lxc-monitord as a system daemon 3342/head
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 31 Mar 2020 13:22:42 +0000 (15:22 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 31 Mar 2020 13:34:56 +0000 (15:34 +0200)
lxc-monitord instances are spawned on demand and, if this
happens from a service, the daemon is considered part of
it by systemd, as it is running in the same cgroups. This
can be avoided by leaving it running permanently.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
.gitignore
config/init/systemd/Makefile.am
config/init/systemd/lxc-monitord.service.in [new file with mode: 0644]
configure.ac
lxc.spec.in
src/lxc/cmd/lxc_monitord.c

index b2d4657c432688df6da699b89c3e51ce63cb1b20..36d0b70135b4c7185e1465392d2c4dfc586205bc 100644 (file)
@@ -119,6 +119,7 @@ config/bash/lxc
 config/init/common/lxc-containers
 config/init/common/lxc-net
 config/init/systemd/lxc-autostart-helper
+config/init/systemd/lxc-monitord.service
 config/init/systemd/lxc-net.service
 config/init/systemd/lxc.service
 config/init/systemd/lxc@.service
index c448850d1b1b487a11ed4f0ce0b9bd82d4e5521a..4a4fde5e75e5706c3b6126fbcefe6ac552620e8b 100644 (file)
@@ -2,19 +2,21 @@ EXTRA_DIST = \
        lxc-apparmor-load \
        lxc.service.in \
        lxc@.service.in \
-       lxc-net.service.in
+       lxc-net.service.in \
+       lxc-monitord.service.in
 
 if INIT_SCRIPT_SYSTEMD
-BUILT_SOURCES = lxc.service lxc@.service lxc-net.service
+BUILT_SOURCES = lxc.service lxc@.service lxc-net.service lxc-monitord.service
 
-install-systemd: lxc.service lxc@.service lxc-net.service lxc-apparmor-load
+install-systemd: lxc.service lxc@.service lxc-net.service lxc-monitord.service lxc-apparmor-load
        $(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
-       $(INSTALL_DATA) lxc.service lxc@.service lxc-net.service $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
+       $(INSTALL_DATA) lxc.service lxc@.service lxc-net.service lxc-monitord.service $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
 
 uninstall-systemd:
        rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc.service
        rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc@.service
        rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc-net.service
+       rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc-monitord.service
        rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
 
 pkglibexec_SCRIPTS = lxc-apparmor-load
diff --git a/config/init/systemd/lxc-monitord.service.in b/config/init/systemd/lxc-monitord.service.in
new file mode 100644 (file)
index 0000000..4063516
--- /dev/null
@@ -0,0 +1,12 @@
+[Unit]
+Description=LXC Container Monitoring Daemon
+After=syslog.service network.target
+
+[Service]
+Type=simple
+ExecStart=@LIBEXECDIR@/lxc/lxc-monitord --daemon
+StandardOutput=syslog
+StandardError=syslog
+
+[Install]
+WantedBy=multi-user.target
index 5956e12deea5296acdf351938b66a5e8be367b5b..fdc57493ca8ee94337a4c4e899ed57bae7ead8a3 100644 (file)
@@ -813,6 +813,7 @@ AC_CONFIG_FILES([
        config/init/systemd/lxc.service
        config/init/systemd/lxc@.service
        config/init/systemd/lxc-net.service
+       config/init/systemd/lxc-monitord.service
        config/init/sysvinit/Makefile
        config/init/sysvinit/lxc-containers
        config/init/sysvinit/lxc-net
index ec6321c333aa8d50f3d66dbcc2e8760561926f45..ea6789fb6e70a5426f755ebadf8231a9ee383b18 100644 (file)
@@ -251,6 +251,7 @@ fi
 %{_unitdir}/lxc-net.service
 %{_unitdir}/lxc.service
 %{_unitdir}/lxc@.service
+%{_unitdir}/lxc-monitord.service
 %else
 %{_sysconfdir}/rc.d/init.d/lxc
 %{_sysconfdir}/rc.d/init.d/lxc-net
index 3ec7a756daa922b0b79c57ad4dc0a01343de4caa..7318df9542816f0f3f46b2b6a2bd6e391838404b 100644 (file)
@@ -338,17 +338,44 @@ static void lxc_monitord_sig_handler(int sig)
 
 int main(int argc, char *argv[])
 {
-       int ret, pipefd;
+       int ret, pipefd = -1;
        char logpath[PATH_MAX];
        sigset_t mask;
-       char *lxcpath = argv[1];
+       const char *lxcpath = NULL;
        bool mainloop_opened = false;
        bool monitord_created = false;
+       bool persistent = false;
        struct lxc_log log;
 
-       if (argc != 3) {
+       if (argc > 1 && !strcmp(argv[1], "--daemon")) {
+               persistent = true;
+               --argc;
+               ++argv;
+       }
+
+       if (argc > 1) {
+               lxcpath = argv[1];
+               --argc;
+               ++argv;
+       } else {
+               lxcpath = lxc_global_config_value("lxc.lxcpath");
+               if (!lxcpath) {
+                       ERROR("Failed to get default lxcpath");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       if (argc > 1) {
+               if (lxc_safe_int(argv[1], &pipefd) < 0)
+                       exit(EXIT_FAILURE);
+               --argc;
+               ++argv;
+       }
+
+       if (argc != 1 || (persistent != (pipefd == -1))) {
                fprintf(stderr,
-                       "Usage: lxc-monitord lxcpath sync-pipe-fd\n\n"
+                       "Usage: lxc-monitord lxcpath sync-pipe-fd\n"
+                       "       lxc-monitord --daemon lxcpath\n\n"
                        "NOTE: lxc-monitord is intended for use by lxc internally\n"
                        "      and does not need to be run by hand\n\n");
                exit(EXIT_FAILURE);
@@ -371,9 +398,6 @@ int main(int argc, char *argv[])
                INFO("Failed to open log file %s, log will be lost", lxcpath);
        lxc_log_options_no_override();
 
-       if (lxc_safe_int(argv[2], &pipefd) < 0)
-               exit(EXIT_FAILURE);
-
        if (sigfillset(&mask) ||
            sigdelset(&mask, SIGILL)  ||
            sigdelset(&mask, SIGSEGV) ||
@@ -406,15 +430,17 @@ int main(int argc, char *argv[])
                goto on_error;
        monitord_created = true;
 
-       /* sync with parent, we're ignoring the return from write
-        * because regardless if it works or not, the following
-        * close will sync us with the parent process. the
-        * if-empty-statement construct is to quiet the
-        * warn-unused-result warning.
-        */
-       if (lxc_write_nointr(pipefd, "S", 1))
-               ;
-       close(pipefd);
+       if (pipefd != -1) {
+               /* sync with parent, we're ignoring the return from write
+                * because regardless if it works or not, the following
+                * close will sync us with the parent process. the
+                * if-empty-statement construct is to quiet the
+                * warn-unused-result warning.
+                */
+               if (lxc_write_nointr(pipefd, "S", 1))
+                       ;
+               close(pipefd);
+       }
 
        if (lxc_monitord_mainloop_add(&monitor)) {
                ERROR("Failed to add mainloop handlers");
@@ -425,7 +451,7 @@ int main(int argc, char *argv[])
               lxc_raw_getpid(), monitor.lxcpath);
 
        for (;;) {
-               ret = lxc_mainloop(&monitor.descr, 1000 * 30);
+               ret = lxc_mainloop(&monitor.descr, persistent ? -1 : 1000 * 30);
                if (ret) {
                        ERROR("mainloop returned an error");
                        break;