Swift 应用程序和 python 代码无法终止 mac 上的某个进程

Swift app and python code fail to kill a certain process on mac

我认为对于这个非常复杂的问题有许多不同的可能解决方案。我正在尝试制作一个基于 swift 的 mac 应用程序,它可以从一个 window 管理我所有的 discord 机器人。我已经成功地打开了不和谐的机器人(使用全局线程,而不是进程对象)。但是,当我退出该应用程序时,我注意到该应用程序启动的 Python 进程保持 运行,discord 机器人也是如此。应用程序不会杀死所有子进程,而是在退出时将 python 的父进程切换为 null。我不太了解 swift,所以我很难让它在关闭时杀死所有子进程(是的,我知道 info.plist 有一些东西,但这只适用于较新的XCode 版本比我可以安装)。为了解决这个问题,我让 AppDelegate.swiftapplicationWillTerminate 代码执行一些 python 代码来杀死任何提到该应用程序正在使用的一个机器人的文件的进程。该机器人存储在名为 roleManager 的文件夹中。这是 python 代码:

import os
import subprocess
import re
subprocess = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)

output, error = subprocess.communicate()
print(output)
roleProcesses=re.findall("roleManager.{20}", str(output))
#this regex probably could have been better but it works
PIDs=[i.split('\n')[1] for i in roleProcesses]
for pid in PIDs:
    with open('killProcesses.sh','w') as file:
        file.write(f'kill {int(pid)}')
    os.system('sudo /Users/nathanwolf/Documents/coding/PycharmProjects/botManagerPythonSide/killProcesses.sh')

subprocess.communicate() returns 一个带有进程列表的字节对象,格式如下(我很确定):

CPU time command associated with process(like usr/local/bin/python3.9 some/python/file)\n(实际上不是回车符\n)PID ??

sudo 之所以存在,是因为有一次它说它没有杀死 运行 机器人之一的权限。这种方法有两个问题。有一次它杀死了自己的 python 进程,尽管它不在文件夹 roleManager 中并崩溃了 PyCharm,大多数时候它无法杀死机器人。为了进行调试,我在 subprocess.communicate() 中查找了机器人的 PID,它与以下命令相关联:

/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/XPCServices/SimulatorTrampoline.xpc/Contents/MacOS/SimulatorTrampoline.

在我看来,有两种可能的解决方案:获取 swift 以终止子进程(不确定为什么这不是默认设置),或获取 python 以成功杀死bot(上面的过程与此有关吗?)。我更喜欢第一个,但哪个都可以。

如果您需要更多信息,请告诉我。

提前致谢!

从另一个 Whosebug 问题中找到了解决方案。我只需要执行以下终端命令: pgrep -f Python | xargs kill -9。这会杀死所有 运行 Python 应用程序,这些应用程序都将由该应用程序控制,因此对我来说可以作为补丁。