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 <simple|list|output|threads|misc|all>' or 'ps --help <s|l|o|t|m|a>' for additional help text. For more details see ps(1). WARNING: 281777 is marked <defunct>, parent: ok ```
This commit is contained in:
parent
a9682c2989
commit
1b533794aa
12
bin/emqx
12
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 <defunct>, parent: $(ps -p "$parent")"
|
||||
return 0
|
||||
fi
|
||||
|
|
Loading…
Reference in New Issue