cleanup: refactoring, using psutil

This commit is contained in:
Devaev Maxim
2019-10-10 03:29:56 +03:00
parent ad5b3c0a0e
commit 4a44f4857c
2 changed files with 54 additions and 21 deletions

View File

@@ -37,7 +37,6 @@ depends=(
python-dbus python-dbus
python-pygments python-pygments
python-pyghmi python-pyghmi
psmisc
v4l-utils v4l-utils
nginx-mainline nginx-mainline
openssl openssl

View File

@@ -21,33 +21,27 @@
import os import os
import subprocess import signal
import time import time
from typing import List from typing import List
from typing import Optional from typing import Optional
import psutil
from ...logging import get_logger from ...logging import get_logger
from ...yamlconf import Section
from ... import gpio from ... import gpio
from .. import init from .. import init
# ===== # =====
def main(argv: Optional[List[str]]=None) -> None: def _clear_gpio(config: Section) -> None:
config = init(
prog="kvmd-cleanup",
description="Kill KVMD and clear resources",
argv=argv,
load_hid=True,
load_atx=True,
load_msd=True,
)[2].kvmd
logger = get_logger(0) logger = get_logger(0)
logger.info("Cleaning up ...")
with gpio.bcm(): with gpio.bcm():
for (name, pin) in [ for (name, pin) in [
*([ *([
@@ -74,15 +68,30 @@ def main(argv: Optional[List[str]]=None) -> None:
except Exception: except Exception:
logger.exception("Can't clear GPIO pin=%d (%s)", pin, name) logger.exception("Can't clear GPIO pin=%d (%s)", pin, name)
streamer = os.path.basename(config.streamer.cmd[0])
logger.info("Trying to find and kill %r ...", streamer)
try:
subprocess.check_output(["killall", streamer], stderr=subprocess.STDOUT)
time.sleep(3)
subprocess.check_output(["killall", "-9", streamer], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError: # pragma: nocover
pass
def _kill_streamer(config: Section) -> None:
logger = get_logger(0)
streamer = os.path.basename(config.streamer.cmd[0])
logger.info("Trying to find and kill %r ...", streamer)
for proc in psutil.process_iter():
attrs = proc.as_dict(attrs=["name"])
if os.path.basename(attrs.get("name", "")) == streamer:
try:
proc.send_signal(signal.SIGTERM)
except Exception:
logger.exception("Can't send SIGTERM to streamer with pid=%d", proc.pid)
time.sleep(3)
if proc.is_running():
try:
proc.send_signal(signal.SIGKILL)
except Exception:
logger.exception("Can't send SIGKILL to streamer with pid=%d", proc.pid)
def _remove_sockets(config: Section) -> None:
logger = get_logger(0)
for (owner, unix_path) in [ for (owner, unix_path) in [
("KVMD", config.server.unix), ("KVMD", config.server.unix),
("streamer", config.streamer.unix), ("streamer", config.streamer.unix),
@@ -94,4 +103,29 @@ def main(argv: Optional[List[str]]=None) -> None:
except Exception: # pragma: nocover except Exception: # pragma: nocover
logger.exception("Can't remove %s socket %r", owner, unix_path) logger.exception("Can't remove %s socket %r", owner, unix_path)
# =====
def main(argv: Optional[List[str]]=None) -> None:
config = init(
prog="kvmd-cleanup",
description="Kill KVMD and clear resources",
argv=argv,
load_hid=True,
load_atx=True,
load_msd=True,
)[2].kvmd
logger = get_logger(0)
logger.info("Cleaning up ...")
for method in [
_clear_gpio,
_kill_streamer,
_remove_sockets,
]:
try:
method(config)
except Exception:
pass
logger.info("Bye-bye") logger.info("Bye-bye")