chiark / gitweb /
service: when after startup only one process is in a service's cgroup, assume it...
[elogind.git] / src / service.c
index dac4adaa6a0efc2cfb1c18fa38349517da97870e..5cf78966a15f9f2fbdd94cf0df5eeadd19ef9f7f 100644 (file)
@@ -1220,6 +1220,30 @@ static int service_load_pid_file(Service *s) {
         return 0;
 }
 
+static int service_search_main_pid(Service *s) {
+        pid_t pid;
+        int r;
+
+        assert(s);
+
+        if (s->main_pid_known)
+                return 0;
+
+        assert(s->main_pid <= 0);
+
+        if ((pid = cgroup_bonding_search_main_pid_list(s->meta.cgroup_bondings)) <= 0)
+                return -ENOENT;
+
+        if ((r = service_set_main_pid(s, pid)) < 0)
+                return r;
+
+        if ((r = unit_watch_pid(UNIT(s), pid)) < 0)
+                /* FIXME: we need to do something here */
+                return r;
+
+        return 0;
+}
+
 static int service_get_sockets(Service *s, Set **_set) {
         Set *set;
         Iterator i;
@@ -1585,6 +1609,7 @@ static int service_spawn(
                         goto fail;
                 }
 
+#ifdef HAVE_SYSV_COMPAT
         /* Make sure we set TERM=linux for SysV scripts, since some
          * require it to be set from the kernel */
         if (s->sysv_path && !strv_env_get(s->meta.manager->environment, "TERM"))
@@ -1592,6 +1617,7 @@ static int service_spawn(
                         r = -ENOMEM;
                         goto fail;
                 }
+#endif
 
         if (!(final_env = strv_env_merge(2,
                                          s->meta.manager->environment,
@@ -2593,8 +2619,8 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                  * START_POST script */
 
                                 if (success) {
-                                        if (s->pid_file)
-                                                service_load_pid_file(s);
+                                        service_load_pid_file(s);
+                                        service_search_main_pid(s);
 
                                         service_enter_start_post(s);
                                 } else