mirror of
https://git.busybox.net/busybox
synced 2026-01-19 15:29:37 +00:00
crond: reap orphaned grandchildren to prevent zombie buildup
If a cron job launches a background task, e.g. `sh -c "sleep 5 &"`, the shell exits immediately and the `sleep` process is re-parented to PID 1. When BusyBox `crond` itself happens to be PID 1 (common in a minimal container), those orphans become direct children of `crond`. Because `crond` only calls waitpid() for the PIDs it explicitly tracks, these processes remain forever in Z state and the container slowly fills with zombies. Add a small `while (waitpid(-1, NULL, WNOHANG) > 0)` sweep at the end of check_completions() so any stray children are reaped. When `crond` is not PID 1 the loop returns -ECHILD immediately, so behaviour and overhead on a normal system are unchanged. Size impact: +12 bytes on x86-64 (gcc 13.3.0 -Os, static) Signed-off-by: Valentin Lab <valentin.lab@kalysto.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
427f808732
commit
41f677ec5d
1 changed files with 4 additions and 0 deletions
|
|
@ -1001,6 +1001,10 @@ static int check_completions(void)
|
|||
/* else: r == 0: "process is still running" */
|
||||
file->cf_has_running = 1;
|
||||
}
|
||||
|
||||
/* Reap any other children we don't actively track */
|
||||
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||
|
||||
//FIXME: if !file->cf_has_running && file->deleted: delete it!
|
||||
//otherwise deleted entries will stay forever, right?
|
||||
num_still_running += file->cf_has_running;
|
||||
|
|
|
|||
Loading…
Reference in a new issue