Merge pull request #55 from tyfiero/Kill-all-processes-and-child-processes-with-ctrl-+-c
Add proper process handling
This commit is contained in:
commit
db235ab206
|
@ -29,6 +29,7 @@ from interpreter import interpreter # Just for code execution. Maybe we should l
|
|||
from ..server.utils.kernel import put_kernel_messages_into_queue
|
||||
from ..server.utils.get_system_info import get_system_info
|
||||
from ..server.stt.stt import stt_wav
|
||||
from process_utils import kill_process_tree
|
||||
|
||||
from ..server.utils.logs import setup_logging
|
||||
from ..server.utils.logs import logger
|
||||
|
@ -217,6 +218,7 @@ class Device:
|
|||
self.toggle_recording(True)
|
||||
elif {keyboard.Key.ctrl, keyboard.KeyCode.from_char('c')} <= self.pressed_keys:
|
||||
logger.info("Ctrl+C pressed. Exiting...")
|
||||
kill_process_tree()
|
||||
os._exit(0)
|
||||
|
||||
def on_release(self, key):
|
||||
|
|
|
@ -8400,4 +8400,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
|
|||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = ">=3.9,<3.12"
|
||||
content-hash = "8bc369fab0a51bfd0538c59c70c239593595fff542b413f9854c8bf5448e7481"
|
||||
content-hash = "4e7112e334cb1610550bcc44ab5f0a257621d774513c24034d60272b741caf51"
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
import os
|
||||
import psutil
|
||||
import signal
|
||||
|
||||
def kill_process_tree():
|
||||
pid = os.getpid() # Get the current process ID
|
||||
try:
|
||||
# Send SIGTERM to the entire process group to ensure all processes are targeted
|
||||
os.killpg(os.getpgid(pid), signal.SIGKILL)
|
||||
parent = psutil.Process(pid)
|
||||
children = parent.children(recursive=True)
|
||||
for child in children:
|
||||
print(f"Forcefully terminating child PID {child.pid}")
|
||||
child.kill() # Forcefully kill the child process immediately
|
||||
gone, still_alive = psutil.wait_procs(children, timeout=3)
|
||||
|
||||
if still_alive:
|
||||
for child in still_alive:
|
||||
print(f"Child PID {child.pid} still alive, attempting another kill")
|
||||
child.kill()
|
||||
|
||||
print(f"Forcefully terminating parent PID {pid}")
|
||||
parent.kill() # Forcefully kill the parent process immediately
|
||||
parent.wait(3) # Wait for the parent process to terminate
|
||||
except psutil.NoSuchProcess:
|
||||
print(f"Process {pid} does not exist or is already terminated")
|
||||
except psutil.AccessDenied:
|
||||
print(f"Permission denied to terminate some processes")
|
|
@ -26,6 +26,7 @@ ngrok = "^1.0.0"
|
|||
simpleaudio = "^1.0.4"
|
||||
opencv-python = "^4.9.0.80"
|
||||
open-interpreter = {version = "0.2.1rc1", extras = ["os"]}
|
||||
psutil = "^5.9.8"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
|
|
|
@ -6,6 +6,8 @@ Just starts `start.sh` with all the same command line arguments. Aliased to 01.
|
|||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import psutil
|
||||
from process_utils import kill_process_tree
|
||||
|
||||
def main():
|
||||
|
||||
|
@ -18,9 +20,9 @@ def main():
|
|||
# Prepare the command
|
||||
command = [os.path.join(dir_path, 'start.sh')] + args
|
||||
|
||||
# Start start.sh with the command line arguments
|
||||
try:
|
||||
subprocess.run(command, check=True)
|
||||
# Start start.sh using psutil for better process management, and to kill all processes
|
||||
psutil.Popen(command)
|
||||
except KeyboardInterrupt:
|
||||
print("Exiting...")
|
||||
|
||||
kill_process_tree()
|
Loading…
Reference in New Issue