Source code for owtf.utils.process

"""
owtf.utils.process
~~~~~~~~~~~~~~~~~~

"""
import os
import logging
import errno
import signal

import psutil

__all__ = ["check_pid", "_signal_process"]


[docs]def check_pid(pid): """Check whether pid exists in the current process table. UNIX only. :param pid: Pid to check :type pid: `int` :return: True if pid exists, else false :rtype: `bool` """ try: os.kill(pid, 0) except OSError as err: if err.errno == errno.ESRCH: # ESRCH == No such process return False elif err.errno == errno.EPERM: # EPERM clearly means there's a process to deny access to return True else: # According to "man 2 kill" possible error values are # (EINVAL, EPERM, ESRCH) raise else: return True
# For psutil TIMEOUT = 3 def _signal_process(pid, psignal=signal.SIGINT): """This function kills all children of a process and abort that process .. note:: Child processes are handled at shell level :param pid: Pid of the process :type pid: `int` :param psignal: Signal to send :type pid: `int` :return: None :rtype: None """ parent = psutil.Process(pid) children = parent.children(recursive=True) children.append(parent) for pid in children: pid.send_signal(psignal) gone, alive = psutil.wait_procs(children, timeout=TIMEOUT) if not alive: # send SIGKILL for pid in alive: logging.debug("Process %d survived SIGTERM; trying SIGKILL", pid) pid.kill()