From dc61969164352245573b2df04f3fff70d8e0e6ac Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 27 Jun 2023 12:22:59 +0200 Subject: [PATCH] Check in `service_stop()` if the process is already dead Related to 6f0d448 in that we check if the kernel knows about this process before we try to stop it. If it's already dead we clean up and return. Signed-off-by: Joachim Wiberg --- src/service.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/service.c b/src/service.c index ddd7e4f3..9203f29c 100644 --- a/src/service.c +++ b/src/service.c @@ -937,13 +937,21 @@ int service_stop(svc_t *svc) compose_cmdline(svc, cmdline, sizeof(cmdline)); if (!svc_is_sysv(svc)) { + char *nm = pid_get_name(svc->pid, NULL, 0); + const char *sig = sig_name(svc->sighalt); + char *id = svc_ident(svc, NULL, 0); + if (svc->pid <= 1) return 1; + if (!nm) { + dbg("Skipping stop (%s) of %s, PID[%d] no longer exists.", sig, id, svc->pid); + service_cleanup(svc); + svc_set_state(svc, SVC_HALTED_STATE); + return 0; + } - dbg("Sending %s to pid:%d name:%s", sig_name(svc->sighalt), - svc->pid, pid_get_name(svc->pid, NULL, 0)); - logit(LOG_CONSOLE | LOG_NOTICE, "Stopping %s[%d], sending %s ...", - svc_ident(svc, NULL, 0), svc->pid, sig_name(svc->sighalt)); + dbg("Sending %s to pid:%d name:%s", sig, svc->pid, nm); + logit(LOG_CONSOLE | LOG_NOTICE, "Stopping %s[%d], sending %s ...", id, svc->pid, sig); } else { logit(LOG_CONSOLE | LOG_NOTICE, "Calling '%s stop' ...", cmdline); }