You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu中用Python终止进程?关联Java进程的.exe关闭方案

解决无法终止隶属于Java进程的.exe程序问题

因为你启动的.nameProgram.exe是Java进程的子进程,直接调用proc.terminate()只会终止子进程,但父Java进程可能会重新拉起它,或者子进程依赖父进程资源导致无法正常退出。以下是几种可行的解决方法:

方法1:通过进程树终止父Java进程及子进程

使用psutil库可以方便遍历进程关系,找到目标exe的父Java进程并一并终止:

  1. 先安装依赖库:
pip install psutil
  1. 实现代码:
import psutil
import subprocess

# 启动目标程序
proc = subprocess.Popen('.\\nameProgram.exe')

# 后续需要关闭时执行
try:
    # 获取目标exe进程实例
    target_process = psutil.Process(proc.pid)
    # 获取父进程(Java进程)
    parent_process = target_process.parent()
    
    # 验证父进程是否为Java进程
    if parent_process and 'java' in parent_process.name().lower():
        # 先尝试优雅终止子进程和父进程
        target_process.terminate()
        parent_process.terminate()
        
        # 等待进程退出,超时则强制杀死
        target_process.wait(timeout=5)
        parent_process.wait(timeout=5)
except psutil.NoSuchProcess:
    print("目标进程已不存在")
except psutil.TimeoutExpired:
    # 优雅终止失败,强制杀死进程
    target_process.kill()
    parent_process.kill()

方法2:使用Windows系统命令强制终止

如果你使用Windows系统,可以直接调用taskkill命令,强制终止目标exe或其关联的Java进程:

终止目标exe:

import subprocess
subprocess.run(['taskkill', '/F', '/IM', 'nameProgram.exe'], check=False)

精准终止对应的Java进程(避免误杀其他Java进程):

如果知道Java进程的命令行参数,可以通过筛选条件指定:

import subprocess
# 替换为你的Java进程的命令行特征
subprocess.run([
    'taskkill', '/F', '/IM', 'java.exe',
    '/FI', 'COMMANDLINE eq *your_java_application_unique_args*'
], check=False)

/F参数表示强制终止,/IM指定进程名称,/FI用于筛选进程属性。

方法3:递归终止整个进程树

如果Java进程还有其他子进程需要一并清理,可以递归终止整个进程树:

import psutil

def terminate_process_tree(pid):
    try:
        proc = psutil.Process(pid)
        # 获取所有递归子进程
        all_children = proc.children(recursive=True)
        # 先终止所有子进程
        for child in all_children:
            child.terminate()
        # 终止父进程
        proc.terminate()
        # 等待进程退出,超时则强制杀死
        gone, alive = psutil.wait_procs(all_children + [proc], timeout=5)
        for p in alive:
            p.kill()
    except psutil.NoSuchProcess:
        pass

# 使用示例:先获取目标exe的父进程PID,再终止整个进程树
target_proc = psutil.Process(proc.pid)
parent_pid = target_proc.parent().pid
terminate_process_tree(parent_pid)

注意事项:

  • terminate()会发送终止信号(Windows下是WM_CLOSE,类Unix下是SIGTERM),属于优雅终止;kill()是强制杀死进程(Windows下是SIGKILL),可能导致数据丢失,建议优先使用terminate()并等待超时后再用kill()。
  • 确保运行代码的用户有足够的权限终止目标进程,否则会执行失败。
  • 跨平台场景优先使用psutil,Windows专属场景可以用taskkill提高效率。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:45:42