问题描述
我想对于这个非常水平的问题有许多不同的可能解决方案。我正在尝试制作一个基于 swift 的 mac 应用程序,它可以从一个窗口管理我所有的不和谐机器人。我已经成功打开了不和谐机器人(使用全局线程,而不是处理对象)。但是,当我退出应用程序时,我注意到应用程序启动的 Python
进程一直在运行,discord bot 也是如此。不是应用程序杀死所有子进程,而是在退出时将 python 的父进程切换到 null
。我不太了解 swift,所以我在它关闭时让它杀死所有子进程时遇到了一些麻烦(是的,我知道 info.plist
有一些东西,但这仅适用于比我新的 XCode 版本可以安装)。为了解决这个问题,我让 applicationWillTerminate
的 AppDelegate.swift
代码执行一些 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() 返回一个字节对象,其中包含一个格式如下的进程列表(我很确定):
cpu time
command associated with process(like usr/local/bin/python3.9 some/python/file)
\n(实际上不是输入字符\n)PID
??
sudo 之所以存在,只是因为有一次它说它无权杀死其中一个正在运行的机器人。这种方法有两个问题。有一次,尽管不在文件夹 roleManager 中,但它杀死了自己的 python 进程并使 PyCharm 崩溃,但大多数情况下它未能杀死机器人。为了调试,我在 subprocess.communicate()
中查找了机器人的 PID,它与以下命令相关联:
/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/xpcServices/SimulatorTrampoline.xpc/Contents/MacOS/SimulatorTrampoline
。
在我看来,可能的解决方案有两种途径:快速杀死子进程(不知道为什么这不是默认值),或者让 python 成功杀死机器人(上述过程是否相关)到这个?)。我更喜欢第一个,但任何一个都可以。
如果您需要更多信息,请告诉我。
非常感谢!
解决方法
从另一个 stackoverflow 问题中找到了解决方案。我只需要执行以下终端命令:
pgrep -f Python | xargs kill -9
。这会杀死所有正在运行的 Python 应用程序,这些应用程序都将通过该应用程序进行控制,因此这对我来说是一个补丁。