Python SIGTERM不终止子进程

2024-05-18 21:41:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个可以启动和关闭进程的类。然而,这似乎并没有结束这一进程。在

我的python代码中,还有其他方法,但它们工作得很好

class KismetInstance:
    """Creates a kismet_server instance"""

    def __init__(self, value=False):
        logging.basicConfig(format='%(asctime)-15s::: %(message)s')
        self.logger = logging.getLogger('kismet_instance')
        self.example = value

    def __create_kismet_instance__(self):
        """
        Create a kismet_server subprocess.
        :return:
        """
        shell = ['sudo', '/usr/local/bin/kismet_server']
        self.logger.debug('Attempting to run: %s', " ".join(shell))
        self.kismet = Popen(shell, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=r'./logs', preexec_fn=os.setsid)


    def __destroy_kismet_instance__(self):
        """
        Kill the subprocess
        :return:
        """
        os.killpg(os.getpgid(self.kismet.pid), 15)

它可以很好地创建子流程。但当我试图杀人时,我会犯这个错误(没有sudo)

^{pr2}$

如果我用sudo运行,那么进程在运行之后仍然在运行。在

pi@raspberrypi ~/project $ ps -A | grep 'kismet'
 2912 ?        00:00:00 kismet_server

Tags: instanceselfreturnserver进程valueoslogging
1条回答
网友
1楼 · 发布于 2024-05-18 21:41:58

我设法解决了这个问题。结果表明,子进程正在重新生成自己,从而导致python无法跟踪它。在

所以我不得不这么做来修复它,然而这并不是最优雅的解决方案,而且非常危险。在

如果您使用这个,请小心,因为如果您输入一个比我的更宽泛的术语('kismet'),那么您可能会杀死系统上的许多进程。在

def __destroy_kismet_instance__(self):
        """
        Kill the subprocess
        :return:
        """
        sig = signal.SIGKILL # What signal to send
        os.killpg(os.getpgid(self.kismet.pid), sig) # Kill one of them
        p_list = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) # Get All processes on system
        out, err = p_list.communicate()
        for line in out.splitlines(): # For each line (or process)
            if 'kismet' in line: # if 'kismet' appears in its name
                pid = int(line.split(None, 1)[0]) # Get the process ID
                self.logger.debug("Found: %d", pid)
                os.killpg(os.getpgid(pid), sig) # Kill the process

相关问题 更多 >

    热门问题