我有一个永远运行的 python 脚本,但我想每天重新启动,以防万一它进入不良状态、关闭等。我每天使用任务调度程序安排它,这很好。
问题是我的脚本产生了其他进程,并且当任务停止时那些子进程不会被杀死(例如:当我手动结束它时,或者任务的新实例运行时)。主脚本被杀死,但子进程没有。我必须通过任务管理器手动杀死它们。如果我在命令行上运行我的主脚本,而不是通过任务调度程序,关闭控制台会按预期终止所有子进程。
我尝试在有和没有“最高权限”的情况下运行任务,“如果任务在请求时没有结束,强制它停止”,“如果任务已经在运行,停止现有实例”等。我试过运行taskkill 作为任务的第一个动作。我已经尝试了我能想到的一切。我以自己的身份运行任务,并且我是管理员。
问题似乎是任务产生的子进程受到访问保护。我试过这样的 taskkill、pskill、python 脚本:
import psutil
for process in psutil.process_iter():
cmdline = process.cmdline()
if "myscript.py" in cmdline:
process.terminate()
我总是收到拒绝访问错误。来自 taskkill 的示例:
c:\>taskkill /f /t /im python.exe
ERROR: The process with PID 14436 (child process of PID 7928) could not be terminated.
Reason: Access is denied.
ERROR: The process with PID 7928 (child process of PID 14324) could not be terminated.
Reason: Access is denied.
...
该死,我什至尝试让我的主要 python 脚本在终止事件出现时杀死它自己的子进程,但我什至没有使用任务调度程序获得该事件,无论是否强制终止!同样,在正常的命令行运行中,我会按预期获得终止事件。但是又一次被任务调度程序挫败了。
这也很容易用运行 python 脚本的一行批处理文件重现。如果任务调度程序运行批处理文件,并且您结束了任务,则任务结束时 python 脚本不会被终止。
知道为什么任务调度程序任务产生的子进程没有被杀死以及如何解决它吗?
谢谢!
如果你可以编辑 python 脚本本身,也许你可以:
希望能帮助到你...