gpt4 book ai didi

Python SIGTERM 不杀死子进程

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:51 25 4
gpt4 key购买 nike

我有一个可以启动和关闭进程的类。但似乎并没有关闭该进程。

我的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)时出现此错误

OSError: [Errno 1] Operation not permitted

如果我使用 sudo 运行,该进程之后仍在运行。

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

最佳答案

我设法解决了这个问题。事实证明,子进程正在重生,创建了一些奇怪的东西,阻止了 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

关于Python SIGTERM 不杀死子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com