From 1b533794aa18ea25e3c90090bb83eb7bcb3984f0 Mon Sep 17 00:00:00 2001 From: Paulo Zulato Date: Sun, 17 Sep 2023 21:53:37 -0300 Subject: [PATCH] fix: handle case that zombie process terminated When emqx is stopped, sometimes it found out that the process is at zombie state and tries to get the parent PID but the process has already finished in the meanwhile, printing an error message like this: ``` error: process ID list syntax error Usage: ps [options] Try 'ps --help ' or 'ps --help ' for additional help text. For more details see ps(1). WARNING: 281777 is marked , parent: ok ``` --- bin/emqx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/bin/emqx b/bin/emqx index b65b5b431..5484a82e5 100755 --- a/bin/emqx +++ b/bin/emqx @@ -805,6 +805,12 @@ generate_config() { mv -f "$TMP_ARG_FILE" "$ARGS_FILE" } +# check if a PID is defunct +is_defunct() { + local PID="$1" + ps -fp "$PID" | $GREP -q 'defunct' +} + # check if a PID is down # shellcheck disable=SC2317 # call in func `nodetool_shutdown()` is_down() { @@ -812,9 +818,13 @@ is_down() { if ps -p "$PID" >/dev/null; then # still around # shellcheck disable=SC2009 # this grep pattern is not a part of the program names - if ps -fp "$PID" | $GREP -q 'defunct'; then + if is_defunct "$PID"; then # zombie state, print parent pid parent="$(ps -o ppid= -p "$PID" | tr -d ' ')" + if [ -z "$parent" ] && ! is_defunct "$PID"; then + # process terminated in the meanwhile + return 0; + fi logwarn "$PID is marked , parent: $(ps -p "$parent")" return 0 fi