新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python+wxPython打造Windows进程管理工具:从采集到打包

发布时间:2026/9/29 5:12:18来源:尧图网络
Python+wxPython打造Windows进程管理工具:从采集到打包
话不多说。前阵子公司有台 Windows 服务器动不动就卡死任务管理器倒是能打开可每次都要手动切到“详细信息”标签页再按内存排序、找到可疑进程、右键结束一天来好几趟手都酸了。更麻烦的是领导还要我记录同一时间点各进程的 CPU 和内存快照任务管理器连导出功能都没有总不能对着屏幕一个一个抄。就是这个契机我决定用 Python 和 wxPython 自己写一个 Windows 进程管理工具。不夸张地说前后折腾了两个晚上从采集进程信息到界面展示、再到结束进程和打包发布一条龙跑通了。这篇文章就是完整的实战记录包含核心代码思路、踩坑教训和选型理由给同样想在 Windows 上做桌面小工具的朋友一个参考。无论你是刚接触 Python 的入门者还是已经在写自动化脚本的运维都能从里面捞出点能直接用的东西。1. 为什么放着任务管理器不用偏要自己写一个进程管理工具1.1 任务管理器满足不了的那些场景先说清楚需求是怎么来的不然很多读者会觉得“这不就是重复造轮子吗”。任务管理器确实够用但只限于“应急看一眼”的场景。一旦你想做下面这几件事它就很难受了按多个条件组合排序。比如既要看 CPU 占用又要看哪个进程占用了特定端口任务管理器做不到。定时自动刷新并保留历史数据。任务管理器只能看当前瞬间没法每小时记录一次并输出 CSV。远程管理或者批量部署。公司内网有几十台 Windows 机器我需要在每台上都放一个免安装的绿色工具让不懂命令行的同事也能自助结束进程。集成到已有的 Python 监控脚本。我原来的脚本已经用 psutil 采集了系统指标如果图形界面也用 Python 写直接把采集层复用过来省掉一整套跨语言对接。这些需求叠加起来与其买个商业软件或者让同事用 PowerShell 背命令不如自己写一个带图形界面的小工具。目标很明确能用鼠标完成绝大多数进程操作顺便能把进程快照导出成表格。1.2 这个工具最终要做成什么样动手之前我给这个工具列了一份功能清单事实证明后面全靠这份清单控制范围功能模块具体说明进程列表显示进程名、PID、CPU 占用、内存占用、线程数、启动时间定时刷新默认每 2 秒刷新一次可调整间隔列排序点击表头按任意字段排序内存数值按真实大小排右键操作结束进程、结束进程树、查看完整路径和命令行进程详情选中进程后显示 exe 路径、工作目录、命令行参数管理员权限结束部分受保护进程时能自动触发 UAC 提权打包发布生成一个免安装的 exe双击即用注意我没打算做“一键优化内存”“关闭启动项”这类花活也没准备做成 XX 管家或者 XX 大师。范围控制住才能在两个晚上内跑通。后面的所有代码都围绕这个最小功能集展开。2. 技术选型为 Windows 进程管理场景挑合适的 Python 组合2.1 为什么不选 C# 和 WinForms这个话题可能有人会杠Windows 原生桌面工具C# WinForms 不是更正统吗确实论界面性能和系统集成的深度C# 在 Windows 上优势明显。但我这里有自己的选择逻辑第一我手头已经有大量 Python 写的监控脚本里面用 psutil 采集数据的逻辑可以直接复用迁移成本几乎为零。 第二公司环境里很多机器没有安装 .NET Framework 或者版本混乱而 Python 打包出来的 exe 通过 PyInstaller 自带运行时反而更容易分发。 第三这个工具后续要加入 HTTP 接口给内网其他系统调用Python 写这个扩展成本低。所以这不是“谁更牛”的问题而是“在现有环境里哪条路最快”的问题。如果你的团队本身就是 .NET 栈那用 C# 完全没问题本文的架构思路照样可以平移过去。2.2 psutil比直接调 Windows API 省事太多获取进程信息在 Windows 上有很多路子EnumProcesses、CreateToolhelp32Snapshot、WMI 查询、PowerShellGet-Process。以前我也直接调过 Win32 API那是真的痛苦句柄管理、结构体对齐、编码转换、32位/64位进程差异随便一个坑都能磨掉半天。psutil 把这些全封装好了。它底层在 Windows 上用 C 调用系统 API但暴露给你的是一个干净的 Python 接口import psutil # 获取所有进程的基本信息 for proc in psutil.process_iter([pid, name]): print(proc.info)就这么几行就能拿到所有进程的 PID 和名字。更棒的是psutil 在不同平台上接口一致今天写的代码明天拿到 Linux 服务器上也能跑对我来说这是隐形成本最低的方案。2.3 wxPython vs PyQt vs TkinterGUI 框架的取舍GUI 框架我前后对比过三个简单说下结论框架优点缺点TkinterPython 自带零依赖学习成本最低控件样式老旧ListCtrl 这种高级表格要自己拼PyQt / PySide功能最强QTableView 配 Model 相当优雅打包体积大LGPL/GPL 许可证要看清wxPython原生外观桌面风格自然ListCtrl 成熟文档相对散控件行为要实测我最后选了 wxPython。原因很直接再复杂的进程管理界面核心也就是一个支持排序的表格加一个右键菜单wx.ListCtrl在这个场景下非常成熟而且 wxPython 的窗口在 Windows 上看起来就是本地风格不需要额外加载一套 UI 皮肤。PyQt 虽然强大但为了一个列表工具引入那么重的框架属实有点杀鸡用牛刀。3. 第一步搭好信息采集层让程序“看得见”系统里的进程3.1 用 psutil 抓取进程快照有了选型第一件事不是画界面而是先把数据层搞定。我的做法是写一个独立的采集模块不掺任何 wxPython 代码这样以后想把这个模块换成命令行版都行。先看最基础的全量快照import psutil def get_process_snapshot(): 返回进程列表每个元素是一个 dict result [] for proc in psutil.process_iter( [pid, name, username, cpu_percent, memory_info, create_time, num_threads] ): try: info proc.info memory_mb info[memory_info].rss / 1024 / 1024 info[memory_mb] round(memory_mb, 1) # 启动时间转成可读字符串 info[create_time_str] ( time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(info[create_time])) if info[create_time] else - ) result.append(info) except (psutil.NoSuchProcess, psutil.AccessDenied): # 进程可能刚退出或者没有权限访问跳过 continue return result你会发现我在遍历时直接把字段名指定好了。psutil 会把不存在的字段填成None而不是报错。用proc.info一次性拿全部字段比反复proc.name()、proc.pid()效率高这对全量刷新来说很重要。3.2 cpu_percent 的两次调用陷阱这里有一个新手必踩的坑psutil 的cpu_percent和memory_percent的机制都类似第一次调用返回的永远是 0。原因是它们计算的是“自上次调用以来”的 CPU 占用率。引擎需要一个基准点没有基准就无法计算。所以如果你第一次遍历就指望拿到真实 CPU 百分比必然全列都是 0.0。正确做法是分两轮采集import time import psutil def get_process_with_cpu(): # 第一轮主要是给 psutil 一个 CPU 基准值 for proc in psutil.process_iter([pid, name]): try: proc.cpu_percent(intervalNone) except (psutil.NoSuchProcess, psutil.AccessDenied): pass # 等一个间隔让 Windows 收集调度数据 time.sleep(0.5) # 第二轮拿到真实的 CPU 占用 result [] for proc in psutil.process_iter( [pid, name, cpu_percent, memory_percent] ): try: result.append(proc.info) except (psutil.NoSuchProcess, psutil.AccessDenied): continue return result注意proc.cpu_percent(intervalNone)是“非阻塞式”的调用它会记录一次 CPU 时间作为基准然后立即返回。隔 0.5 秒后再调用才能拿到这个时间段内的平均占用率。如果你的 UI 刷新间隔是 2 秒这个 0.5 秒完全来得及。3.3 进程详情的数据结构设计采集层不能只给界面丢一堆字段不然排序和列表刷新会变成一场灾难。我的做法是定义一个标准的列表存进程列表数据再单独写一个“详情”查询函数用于用户点某一行的实时查询。列表数据我直接用list[dict]好处是排序简单self.process_data [] # 每个元素长这样 # { # pid: 1234, # name: chrome.exe, # cpu_percent: 12.3, # memory_mb: 456.7, # num_threads: 25, # create_time_str: 2025-01-01 09:00:00, # username: DESKTOP-xx\\user # }而详情函数单独用一个psutil.Process(pid)来实时拉取def get_process_detail(pid): try: p psutil.Process(pid) detail { pid: p.pid, name: p.name(), exe: p.exe(), cwd: p.cwd(), cmdline: p.cmdline(), status: p.status(), create_time: p.create_time(), num_threads: p.num_threads(), } # 尝试获取进程占用的连接信息 detail[connections] p.connections() return detail except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e: return {error: str(e)}这里必须做好异常处理。Windows 上进程退出的速度比你想象中快前 0.1 秒还在列表里后 0.1 秒就被用户关了。p.exe()和p.cwd()在权限不足时会抛AccessDenied不要因为这些小异常让整个 UI 卡住尽量做到“拿不到就显示未知”。4. 第二步界面层落地用 wx.ListCtrl 撑起进程表格4.1 主窗口布局与 ListCtrl 的姿势wxPython 的布局我踩过不少次最开始喜欢用绝对坐标SetPosition结果窗口一拉伸就全部错位。后来老老实实用wx.BoxSizer垂直分两块顶部放按钮和搜索框中间放表格。主窗口核心框架长这样import wx class MainFrame(wx.Frame): def __init__(self): super().__init__(None, title进程管理工具, size(1000, 650)) self.panel wx.Panel(self) # 顶部工具栏区域 top_sizer wx.BoxSizer(wx.HORIZONTAL) self.refresh_btn wx.Button(self.panel, label刷新) self.search_ctrl wx.SearchCtrl(self.panel) self.search_ctrl.SetDescriptiveText(输入进程名过滤) self.refresh_interval wx.ComboBox( self.panel, choices[1s, 2s, 5s], value2s) top_sizer.Add(self.refresh_btn, 0, wx.ALL, 5) top_sizer.Add(self.search_ctrl, 1, wx.ALL | wx.EXPAND, 5) top_sizer.Add(self.refresh_interval, 0, wx.ALL, 5) # 中间进程列表区域 self.list wx.ListCtrl( self.panel, stylewx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES | wx.LC_HRULES) # 主布局 main_sizer wx.BoxSizer(wx.VERTICAL) main_sizer.Add(top_sizer, 0, wx.EXPAND) main_sizer.Add(self.list, 1, wx.ALL | wx.EXPAND, 5) self.panel.SetSizer(main_sizer) self.columns [ (pid, PID), (name, 进程名), (cpu_percent, CPU %), (memory_mb, 内存(MB)), (num_threads, 线程数), (create_time_str, 启动时间), ] for idx, (_, title) in enumerate(self.columns): self.list.InsertColumn(idx, title, width120) self.list.SetColumnWidth(2, 80) self.list.SetColumnWidth(5, 160) self.status_bar self.CreateStatusBar() self.status_bar.SetStatusText(就绪)ListCtrl 的style参数很关键。LC_REPORT表示显示为表格LC_SINGLE_SEL限制单选LC_VRULES和LC_HRULES绘制垂直、水平网格线。不加这些样式列表看起来就像个简单的 listbox不像进程管理器。4.2 定时刷新与 Freeze/Thaw 防闪烁实时刷新最容易出现两个问题一是卡顿二是闪烁。卡顿来自采集阻塞。psutil 全量遍历加 CPU 计算大概要几十毫秒不至于卡死但如果你在主线程里频繁做大量字符串转换UI 就会明显掉帧。我的做法是把刷新逻辑交给wx.Timer但采集动作不在定时器回调里做重活而是只负责“标记需要刷新”真正刷新放到空闲时。更简洁的做法是直接定时刷新只要把间隔控制在 2 秒实测依然流畅。闪烁问题则必须用Freeze/Thaw解决。wx.ListCtrl在每次DeleteAllItems之后重绘表格会产生肉眼可见的白屏闪烁。把刷新动作包在 Freeze/Thaw 里修改不会立刻绘制等解除冻结后一次性重画效果会好很多。def refresh_list(self): snapshot get_process_snapshot() keyword self.search_ctrl.GetValue().strip().lower() # 过滤 if keyword: snapshot [p for p in snapshot if keyword in p[name].lower()] self.list.Freeze() self.list.DeleteAllItems() for row, info in enumerate(snapshot): self.list.InsertItem(row, str(info[pid])) self.list.SetItem(row, 1, info[name]) self.list.SetItem(row, 2, f{info[cpu_percent]:.1f}) self.list.SetItem(row, 3, f{info[memory_mb]:.1f}) self.list.SetItem(row, 4, str(info[num_threads])) self.list.SetItem(row, 5, info[create_time_str]) # 保留 pid 到行数据里后续右键操作要用 self.list.SetItemData(row, info[pid]) self.list.Thaw() self.status_bar.SetStatusText(f共 {len(snapshot)} 个进程)注意SetItemData不是显示数据它是把 pid 作为“行关联数据”存进 ListCtrl 内部。后面我们用self.list.GetItemData(row)就能拿到这行对应的真实 PID而不必从第一列的字符串再转一次。这个设计能省掉很多字符串解析的麻烦。4.3 点击表头排序把 ListCtrl 的排序逻辑一次讲透wx.ListCtrl 本身不提供表头排序但我们可以绑定EVT_LIST_COL_CLICK事件自己实现。想清楚核心思路就不复杂所有数据已经存在self.process_data里排序只是对这个列表重新排序然后重新渲染一次表格。唯一要处理的是“数值排序”问题。按进程名、PID 排的时候很简单但按 CPU 或内存排的时候直接在内存里存字符串就废了。所以我列表数据里的cpu_percent和memory_mb必须是浮点数只在显示时格式化成字符串。def on_col_click(self, event): col event.GetColumn() # 点击同一列就切换升序/降序 if col self.current_sort_col: self.ascending not self.ascending else: self.current_sort_col col self.ascending True key self.columns[col][0] # 默认对字符串排序但如果字段是数值就直接按数值排 self.process_data.sort( keylambda x: x.get(key), reversenot self.ascending ) self.render_list() # 渲染函数内部是 Freeze 填行如果你的数据里某些字段是 None比如拿不到用户名排序时可能会报类型错误。稳妥做法是给 sort key 包一个默认值self.process_data.sort( keylambda x: (x.get(key) is None, x.get(key)), reversenot self.ascending )这样 None 永远排在最后不会与数字比较时报错。5. 第三步进程操作与权限处理这才是 Windows 上最容易翻车的地方5.1 右键菜单与进程控制命令列表能看了接下来就是操作。右键菜单负责整套交互结束进程、结束进程树、查看详情。def on_list_right_click(self, event): row event.GetIndex() if row -1: return pid self.list.GetItemData(row) menu wx.Menu() info_item menu.Append(wx.ID_ANY, 查看详细信息) kill_item menu.Append(wx.ID_ANY, 结束进程) kill_tree_item menu.Append(wx.ID_ANY, 结束进程树) menu.AppendSeparator() refresh_item menu.Append(wx.ID_ANY, 刷新列表) self.Bind(wx.EVT_MENU, lambda e: self.show_detail(pid), info_item) self.Bind(wx.EVT_MENU, lambda e: self.kill_process(pid), kill_item) self.Bind(wx.EVT_MENU, lambda e: self.kill_process_tree(pid), kill_tree_item) self.Bind(wx.EVT_MENU, lambda e: self.refresh_list(), refresh_item) self.PopupMenu(menu) menu.Destroy()这里有个 wxPython 的老坑菜单使用完如果不Destroy()内存会一直累积界面开久了越来越卡所以一定要销毁。5.2 判断管理员权限用 ctypes 让程序自己弹 UAC 窗结束进程不像看起来那么简单。Windows 上很多系统进程、其他用户启动的进程普通权限根本碰不了。psutil 调用proc.terminate()时会抛psutil.AccessDenied传统做法只知道报错体验很差。我的方案是程序启动时就检测权限如果当前不是管理员点击“结束进程”时直接触发 UAC 提权让 Windows 弹标准的安全提示框。想做到这一点需要组合使用两个 Win32 APIimport ctypes import sys def is_admin(): try: return bool(ctypes.windll.shell32.IsUserAnAdmin()) except Exception: return False def restart_as_admin(): 用管理员权限重新启动当前程序 ctypes.windll.shell32.ShellExecuteW( None, runas, sys.executable, .join(sys.argv), None, 1 )IsUserAnAdmin()是最直接的检测函数。如果返回 False而你又试图获取高权限进程信息后续操作必然受阻。ShellExecuteW配合runas动词Windows 就会弹出 UAC 提权确认。用户点“是”之后程序带着管理员权限重启读取数据就顺畅多了。这里要特别说明如果你用 PyInstaller 打包成 exe重启命令里的sys.executable不再指向 python.exe而是你的 exe 路径。判断逻辑要稍微改一下if getattr(sys, frozen, False): # 打包后的 exe 场景 exe_path sys.executable else: exe_path sys.executable .join(sys.argv)5.3 结束进程的权限边界和兜底方案就算有了管理员权限也依然有结束不了的进程。系统关键进程比如System Idle Process、smss.exe、csrss.exe受到 Windows 的额外保护强行结束轻则蓝屏重则系统崩溃。所以结束前至少要做一个基础判断def kill_process(self, pid): if pid 4: wx.MessageBox(系统核心进程不能结束, 提示, wx.OK | wx.ICON_WARNING) return try: proc psutil.Process(pid) proc.terminate() # 先礼貌地请求退出 proc.wait(timeout3) except psutil.NoSuchProcess: wx.MessageBox(进程已退出, 提示, wx.OK | wx.ICON_INFORMATION) except psutil.AccessDenied: # 权限不足用 taskkill /F 兜底 result subprocess.run( [taskkill, /PID, str(pid), /F], capture_outputTrue, textTrue ) if result.returncode 0: wx.MessageBox(进程已被强制结束, 成功, wx.OK | wx.ICON_INFORMATION) else: wx.MessageBox(result.stderr.strip(), 失败, wx.OK | wx.ICON_ERROR) except psutil.TimeoutExpired: # 超时后强制结束Windows 下很少有进程响应 terminate proc.kill()terminate()在 Windows 上本质是投递一条关闭消息部分进程会无视。所以超时后直接kill()是正常操作别心软。taskkill /F则是更底层的强制结束适合处理某些顽固进程。6. 打包发布PyInstaller 把工具变成绿色 exe6.1 PyInstaller 命令与隐藏依赖到了这一步工具在开发环境里已经能跑了但总要双击 exe 才是真正交付。PyInstaller 是打包 Python 程序最成熟的方案命令很简单pyinstaller --noconfirm --onefile --windowed --nameProcessManager main.py参数解释参数作用--onefile把所有东西打进一个 exe方便分发--windowed不弹黑色控制台窗口GUI 程序必备--name指定输出文件名有几个容易踩的细节wxPython 和 psutil 依赖 PyInstaller 都能自动分析出来基本不用手动--hidden-import。--windowed模式下print()没有输出窗口所以调试时最好先在开发环境跑通别指望打包后靠打印排查。杀毒软件误报是个现实问题。PyInstaller 打的 exe 因为要自解压运行时很容易被某些杀毒软件标记。解决办法一般是加图标、改版本信息、或者对 exe 再做一次数字签名。公司内部用的话可以把目录加入白名单。6.2 申请管理员权限的 manifest 配置前面提到程序需要管理员权限但打包后的 exe 每次手动右键“以管理员身份运行”太不友好。让 exe 双击就自动申请 UAC需要在 exe 里嵌入一个 manifest。PyInstaller 提供了一个参数直接搞定pyinstaller --onefile --windowed --uac-admin --nameProcessManager main.py--uac-admin会在生成的 exe 中嵌入“requireAdministrator”级别的 manifest。之后用户双击 exe系统会直接弹出 UAC 确认框确认后程序就以管理员身份运行。如果你还想做更精细的权限控制比如“默认普通权限需要时才提权”就不要用--uac-admin而是保留程序内ShellExecuteW提权方案。这是两种不同的产品逻辑我最终选择了后者因为大多数时候用户只是看一眼进程列表没必要每次都弹 UAC 框吓人。6.3 发布前做一轮真实机器测试打包完成后在开发机跑通不代表万事大吉。Windows 环境差异比想象中大多了我专门找了三类机器验证Win10 64 位最常见环境Win11 24H2新系统检查兼容性一台未安装任何 Python 的纯净虚拟机验证 exe 是否自包含测试重点包括列表能否正常刷新、点击表头排序是否符合预期、结束非管理员进程是否触发 UAC、打包后的 exe 在没有 Python 的环境下能否启动。建议在纯净虚拟机里跑全套功能因为这是最接近用户实际场景的环境。7. 一些从实际使用中提炼的注意事项工具上线后我自己继续用了大半个月期间又踩了一些零碎的坑整理成几条经验分享给你。第一刷新间隔不要太短。我把默认刷新间隔设为 2 秒实测 CPU 占用才稳定、UI 不卡。把间隔改成 500 毫秒后虽然数据更新更频繁但 CPU 占用本身会虚高因为采集动作也要消耗 CPU而且列表频繁重建会让人眼疲劳。进程管理器这种工具1 到 2 秒刷新一次已经是极限。第二内存数据要保留原始数值。我在process_data里存的是memory_mb浮点数显示时再格式化成字符串。如果图省事存了字符串按内存排序的时候就会得到 100MB 20MB 这种荒谬结果。所有需要排序的字段都要保持可比较的数据类型。第三结束进程前最好弹一次确认框。我一开始没加确认手滑把某个业务进程结束掉之后同事当场找我“喝茶”。后来在kill_process里加了wx.MessageBox二次确认虽然多了个点击但安全了很多。用工具的人多了之后这种保护不是多余。第四exe 的图标别忽略。PyInstaller 支持--iconapp.ico参数加一个 ico 文件很简单但观感完全不同。尤其给别人用的时候没有图标的 exe 看起来像临时脚本信任度低。工具本身还在迭代。后续我准备把进程快照导出 CSV 做成按钮再把占用某个端口的进程查询也集成进去这样 Windows 下排查端口冲突就不用总敲netstat -ano了。如果你也在做类似的小工具欢迎按这个思路去扩展进程管理这个场景能做的事远比“看一眼、杀一个进程”要多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

网络安全评估工具设计与实现:模块化架构与Python实战 2026/9/29 6:55:37

网络安全评估工具设计与实现:模块化架构与Python实战

简介:《网络安全评估工具的设计与实现》是一篇西南财经大学计算机科学与技术专业本科毕业论文,全文约一万字,指导教师为牛哄哄教授。论文聚焦网络安全评估工具的完整设计与实现,围绕网络漏洞扫描、渗透测试等核心技术,…

阅读更多 →
局域网安全毕业设计论文方案:VLAN划分与防火墙部署详解 2026/9/29 6:55:37

局域网安全毕业设计论文方案:VLAN划分与防火墙部署详解

简介:一份面向计算机与信息安全专业毕业生的网络安全设计毕业设计论文文档,以局域网安全控制与病毒防治为主线,系统梳理了从安全现状、威胁分析到防护实施的完整路径。内容涵盖网络分段、以交换式集线器代替共享式集线器、VLAN划分等局域网安…

阅读更多 →
Claude Code 开发 Python 应用:Flask + Bootstrap 5 + jQuery 场景要求与 TaoToken 配置骨架 2026/9/29 6:55:37

Claude Code 开发 Python 应用:Flask + Bootstrap 5 + jQuery 场景要求与 TaoToken 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Claude Code Skills 进阶:用 SKILL.md 与 Subagents 把重复流程交给 TaoToken 统一调度 2026/9/29 6:55:37

Claude Code Skills 进阶:用 SKILL.md 与 Subagents 把重复流程交给 TaoToken 统一调度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Linux top命令深度解析:从进程监控到系统诊断 2026/9/29 6:55:31

Linux top命令深度解析:从进程监控到系统诊断

1. 为什么你总在“top”里迷路——从窗口右键置顶到系统进程监控的思维断层很多人第一次听说top,是在Ubuntu桌面环境下——右键点击窗口标题栏,“Always on Top”那个选项闪得特别显眼。但当你切到终端敲下top,看到满屏跳动的数字和缩写&…

阅读更多 →
Eclipse 2025.6 创建 Maven Web 项目并接入 TaoToken AI 助手:settings.json 配置与验证 2026/9/29 6:55:31

Eclipse 2025.6 创建 Maven Web 项目并接入 TaoToken AI 助手:settings.json 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉