##// END OF EJS Templates
tests: add a module that can perform the equivalent of `SIGKILL` on any OS...
tests: add a module that can perform the equivalent of `SIGKILL` on any OS I started with this being Windows specific, but let's push all of the decision making into this function so that it can just be called by the tests. The tradeoff is that this is very specific to sending `SIGKILL`- since `signal.SIGKILL` doesn't exist on Windows, the desired signal can't be passed from the caller. Maybe there's a way, but let's wait until there's a need. We don't use `killdaemons.py` unconditionally because it starts with a more graceful `SIGTERM` on posix.

File last commit:

r52889:625cf962 default
r52889:625cf962 default
Show More
ps_util.py
50 lines | 1.2 KiB | text/x-python | PythonLexer
# This python code can be imported into tests in order to terminate a process
# with signal.SIGKILL on posix, or a roughly equivalent procedure on Windows.
import os
import signal
import subprocess
import sys
import tempfile
from .. import (
encoding,
pycompat,
)
from ..utils import procutil
def kill_nt(pid: int, exit_code: int):
fd, pidfile = tempfile.mkstemp(
prefix=b"sigkill-", dir=encoding.environ[b"HGTMP"], text=False
)
try:
os.write(fd, b'%d\n' % pid)
finally:
os.close(fd)
env = dict(encoding.environ)
env[b"DAEMON_EXITCODE"] = b"%d" % exit_code
# Simulate the message written to stderr for this process on non-Windows
# platforms, for test consistency.
print("Killed!", file=sys.stderr)
subprocess.run(
[
encoding.environ[b"PYTHON"],
b"%s/killdaemons.py"
% encoding.environ[b'RUNTESTDIR_FORWARD_SLASH'],
pidfile,
],
env=procutil.tonativeenv(env),
)
def kill(pid: int):
"""Kill the process with the given PID with SIGKILL or equivalent."""
if pycompat.iswindows:
exit_code = 128 + 9
kill_nt(pid, exit_code)
else:
os.kill(pid, signal.SIGKILL)