Avoid waiting for zombie processes in synctl stop (#11490)

This commit is contained in:
Sean Quah 2021-12-02 16:07:06 +00:00 committed by GitHub
parent 858d80bf0f
commit b50e39df57
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 3 deletions

View file

@ -0,0 +1 @@
`synctl stop` will now wait for Synapse to exit before returning.

19
synctl
View file

@ -41,11 +41,24 @@ NORMAL = "\x1b[m"
def pid_running(pid): def pid_running(pid):
try: try:
os.kill(pid, 0) os.kill(pid, 0)
return True
except OSError as err: except OSError as err:
if err.errno == errno.EPERM: if err.errno == errno.EPERM:
return True pass # process exists
return False else:
return False
# When running in a container, orphan processes may not get reaped and their
# PIDs may remain valid. Try to work around the issue.
try:
with open(f"/proc/{pid}/status") as status_file:
if "zombie" in status_file.read():
return False
except Exception:
# This isn't Linux or `/proc/` is unavailable.
# Assume that the process is still running.
pass
return True
def write(message, colour=NORMAL, stream=sys.stdout): def write(message, colour=NORMAL, stream=sys.stdout):