You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.5 KiB
45 lines
1.5 KiB
From 04213418a4e8d4e7f74f5b8b03713172a658d9e4 Mon Sep 17 00:00:00 2001 |
|
From: Michal Sekletar <msekleta@redhat.com> |
|
Date: Fri, 12 Jan 2018 13:05:48 +0100 |
|
Subject: [PATCH] process-util: make our freeze() routine do something useful |
|
|
|
When we crash we freeze() our-self (or possibly we reboot the machine if |
|
that is configured). However, calling pause() is very unhelpful thing to |
|
do. We should at least continue to do what init systems being doing |
|
since 70's and that is reaping zombies. Otherwise zombies start to |
|
accumulate on the system which is a very bad thing. As that can prevent |
|
admin from taking manual steps to reboot the machine in somewhat |
|
graceful manner (e.g. manually stopping services, unmounting data |
|
volumes and calling reboot -f). |
|
|
|
Fixes #7783 |
|
|
|
(cherry picked from commit 8647283e453e4039029e2b21270241fa4010b3d8) |
|
|
|
Resolves: #1540941 |
|
--- |
|
src/shared/util.c | 11 +++++++++++ |
|
1 file changed, 11 insertions(+) |
|
|
|
diff --git a/src/shared/util.c b/src/shared/util.c |
|
index 39359fcc8..af0953273 100644 |
|
--- a/src/shared/util.c |
|
+++ b/src/shared/util.c |
|
@@ -4158,6 +4158,17 @@ noreturn void freeze(void) { |
|
|
|
sync(); |
|
|
|
+ /* Let's not freeze right away, but keep reaping zombies. */ |
|
+ for (;;) { |
|
+ int r; |
|
+ siginfo_t si = {}; |
|
+ |
|
+ r = waitid(P_ALL, 0, &si, WEXITED); |
|
+ if (r < 0 && errno != EINTR) |
|
+ break; |
|
+ } |
|
+ |
|
+ /* waitid() failed with an unexpected error, things are really borked. Freeze now! */ |
|
for (;;) |
|
pause(); |
|
}
|
|
|