【发布时间】:2019-10-24 08:51:08
【问题描述】:
我有一个 Python 应用程序,它作为控制台脚本安装在 Windows 上。
我希望应用程序作为后台进程运行一段时间,然后我想终止它。
我开始这个过程:
START /B <application_name>
并尝试使用以下命令终止它:
taskkill /PID <PID>
但是,当我尝试终止进程时,没有强制选项,我收到错误:
ERROR: The process with PID 17836 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).
有谁知道我应该如何扩展我的 Python 应用程序以便在没有强制选项的情况下终止它?
不确定它是否重要,但我注意到启动应用程序实际上会创建两个进程,一个似乎是父进程的 python.exe 进程和一个应用程序进程。
【问题讨论】:
-
你在这个 python 应用程序中是否调用了 subprocess 模块?
-
嗨@JimErginbash,我的应用程序确实对子进程进行了任何调用。不确定这是否相关,但它通过 aiohttp 模块使用 aysnc。
-
非强制终止仅意味着 taskkill.exe 将
WM_CLOSE发送到进程拥有的顶级和仅消息窗口。 (可能仅在 Windows 10 中支持关闭仅消息窗口。)只有一个控制台应用程序被认为是控制台窗口的有效所有者,它最初是分配控制台的进程。 (省略start的/B选项,让您的程序分配一个新的控制台。)这不是一个可靠的状态。相反,您可以通过启动正常退出来托管处理WM_CLOSE的仅消息或顶级不可见窗口。 -
请注意,如果您以控制台窗口的有效所有者为目标,taskkill.exe 不会询问您是否真的要关闭控制台。它只是盲目地关闭它。因此,连接到控制台的所有进程都会发送一个控制关闭事件,并在它们被强制终止之前有 5 秒的时间退出。一旦窗口关闭,连接到控制台的进程就无法继续运行。充其量它可以重新生成一个新进程来响应关闭事件。