chiark / gitweb /
service: never clean up a service that still has a process in it
authorLennart Poettering <lennart@poettering.net>
Fri, 25 Feb 2011 00:49:10 +0000 (01:49 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 25 Feb 2011 00:49:10 +0000 (01:49 +0100)
src/service.c

index e928d1a5e0050fd533fdd2bbb64b27756bf06229..fef96e17dd96da3fd54501c8b7f1a8bd41e2dab1 100644 (file)
@@ -2496,16 +2496,26 @@ static const char *service_sub_state_to_string(Unit *u) {
         return service_state_to_string(SERVICE(u)->state);
 }
 
-#ifdef HAVE_SYSV_COMPAT
 static bool service_check_gc(Unit *u) {
         Service *s = SERVICE(u);
 
         assert(s);
 
-        return !!s->sysv_path;
-}
+        /* Never clean up services that still have a process around,
+         * even if the service is formally dead. */
+        if (cgroup_good(s) > 0 ||
+            main_pid_good(s) > 0 ||
+            control_pid_good(s) > 0)
+                return true;
+
+#ifdef HAVE_SYSV_COMPAT
+        if (s->sysv_path)
+                return true;
 #endif
 
+        return false;
+}
+
 static bool service_check_snapshot(Unit *u) {
         Service *s = SERVICE(u);
 
@@ -3317,9 +3327,7 @@ const UnitVTable service_vtable = {
         .active_state = service_active_state,
         .sub_state_to_string = service_sub_state_to_string,
 
-#ifdef HAVE_SYSV_COMPAT
         .check_gc = service_check_gc,
-#endif
         .check_snapshot = service_check_snapshot,
 
         .sigchld_event = service_sigchld_event,