news 2026/5/9 8:02:32

macOS防休眠工具:Python模拟鼠标移动实现系统保活

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
macOS防休眠工具:Python模拟鼠标移动实现系统保活

1. 项目概述:一个解决 macOS 用户“痛点”的小工具

如果你是一名长期在 macOS 系统下工作的开发者、设计师或者文字工作者,大概率遇到过这个场景:你正全神贯注地阅读一份冗长的技术文档,或者沉浸在调试代码的逻辑中,电脑屏幕突然暗了下去,进入了睡眠状态。你不得不晃动一下鼠标或者敲击键盘来唤醒它,打断当前的思路。更令人烦恼的是,一些需要长时间运行的任务,比如下载大文件、渲染视频或者跑一个漫长的数据处理脚本,可能会因为系统休眠而中断。虽然系统自带的“节能”设置可以调整,但总有一些场景,你既希望屏幕常亮、系统不休眠,又不想手动去修改那些全局设置,或者安装功能复杂、权限要求高的第三方软件。

ansh-info/move-mouse-macOS这个项目,就是为了解决这个看似微小却非常实际的痛点而生的。它是一个用 Python 编写的轻量级命令行工具,核心功能非常纯粹:在 macOS 系统上,自动、模拟地移动鼠标光标。通过这种模拟操作,它可以“欺骗”系统,让系统认为用户一直在活动,从而阻止其进入睡眠状态,保持屏幕常亮。这个工具特别适合那些追求效率、喜欢用脚本和命令行解决问题,或者对系统工具有“洁癖”,不希望安装臃肿 GUI 应用的用户。

它的价值在于“精准”和“克制”。它不试图做一个功能大全的系统优化工具,而是聚焦于单一需求,用最少的代码和依赖实现目标。整个项目结构清晰,代码量不大,但涵盖了从原理到实践的几个关键环节:如何通过编程与 macOS 的底层 Quartz 显示服务交互、如何模拟真实的鼠标事件以避免被系统识别为“假活动”、如何设计一个用户友好的命令行接口,以及如何将其打包成易于分发的形式。接下来,我们就深入拆解这个项目的设计思路、技术实现细节以及我在实际使用和扩展过程中积累的经验。

2. 核心原理与方案选型:为什么是 Python 和 Quartz?

2.1 需求本质与实现路径分析

要实现“防止系统休眠”,在 macOS 上有几条技术路径可选。理解这些路径,有助于我们明白为什么这个项目选择了当前的方案。

  1. 调用系统级防休眠 API (Caffeinate):macOS 自带一个强大的命令行工具caffeinate。执行caffeinate -d可以阻止显示器休眠,caffeinate -i阻止系统休眠,caffeinate -dis则两者都阻止。这是最直接、最底层的方法。那么,为什么不直接封装caffeinate呢?原因在于灵活性和模拟真实性。caffeinate是一个“开关”,一旦开启,在它运行期间系统就不会休眠,但这可能过于“粗暴”,且无法模拟出用户活动的“脉搏”。而移动鼠标则是一种更“温和”、更模拟真实用户行为的方式,并且可以更精细地控制“活动”的时机和方式。

  2. 模拟用户输入事件:这正是本项目采用的核心方案。通过程序模拟鼠标移动、点击或键盘敲击,系统会将其识别为真实的用户活动,从而重置休眠计时器。这需要在操作系统层面合成和发送输入事件。

  3. 修改系统节能偏好设置:通过脚本或程序调用pmset命令临时修改电源管理参数。但这需要管理员权限 (sudo),并且是全局性的修改,可能影响其他使用场景,不够安全也不够优雅。

综合比较,方案2(模拟输入事件)在无需特殊权限、行为模拟真实、对系统影响最小这几个维度上取得了最佳平衡。它实现了一个“无感”的保活机制,这正是该项目的精巧之处。

2.2 技术栈选择:Python + pyobjc 的必然性

选择了模拟鼠标移动的方案后,下一个问题就是:用什么技术实现?

  • 为什么是 Python?Python 在 macOS 上通常是预装或极易安装的,拥有庞大的生态系统和丰富的库支持。对于这样一个工具类项目,Python 脚本的跨版本兼容性相对较好,编写和调试效率高,也便于其他开发者阅读和贡献代码。用 Shell 脚本直接调用底层 C API 过于复杂,而 Swift/Objective-C 编译型语言虽然性能最佳,但对于分发和用户使用来说门槛稍高。Python 在易用性和能力之间找到了一个完美的结合点。

  • 为什么是 PyObjC?要在 Python 中与 macOS 底层的 Cocoa 框架交互,特别是调用 Quartz Event Services 来合成鼠标事件,PyObjC几乎是唯一成熟、稳定的选择。PyObjC 是一个 Python 到 Objective-C 的桥接器,它让 Python 代码能够直接调用 macOS 丰富的原生 API。Quartz 是 macOS 的图形层,负责窗口管理和事件处理,其中的Quartz.EventTapQuartz.CGEvent等 API 正是生成模拟事件的钥匙。通过 PyObjC,我们可以用 Python 语法轻松地创建鼠标移动事件,并将其发布到系统事件流中。

注意:在较新的 macOS 版本(特别是 macOS Catalina 10.15 及以后)中,出于安全考虑,程序想要模拟输入事件需要用户授予“辅助功能”权限。这是所有采用此方案的工具都必须面对和妥善处理的一环,本工具也不例外。我们会在后续的“实操与问题排查”章节详细讨论如何引导用户完成授权。

2.3 工具设计哲学:简单、可配置、无侵入

从项目源码可以看出,作者遵循了 Unix 哲学——“Do One Thing and Do It Well”。工具的核心就是一个 Python 脚本,通过命令行参数接受配置,比如:

  • 移动间隔:每隔多少秒移动一次鼠标。
  • 移动像素:每次移动多少像素(通常很小,比如1-5像素,避免干扰真实操作)。
  • 移动模式:是简单地来回移动,还是随机方向移动,或者沿着屏幕边缘做圆周运动。
  • 运行时⻓:工具运行多长时间后自动退出。

这种设计使得它极易被集成到其他自动化脚本中,例如,你可以写一个 Shell 脚本,在启动你的长时间运行任务前,启动这个鼠标移动工具,任务结束后再终止它。整个过程中,你的系统节能设置无需任何改动,工具退出后一切恢复原样,实现了“无侵入”。

3. 核心代码解析与关键技术点

让我们深入到核心代码层面,看看如何用 PyObjC 实现鼠标移动。这里我会结合常见实现进行解析,并补充一些原项目可能未提及的细节和优化思路。

3.1 事件合成的核心代码

模拟一个鼠标移动事件,主要分为三步:创建事件、设置事件属性、发布事件。

#!/usr/bin/env python3 import time import random import argparse from AppKit import NSEvent import Quartz def move_mouse(dx, dy): """ 将鼠标光标相对移动 (dx, dy) 像素。 """ # 1. 获取当前鼠标位置 current_event = Quartz.CGEventCreate(None) current_point = Quartz.CGEventGetLocation(current_event) # 2. 创建鼠标移动事件 # kCGEventMouseMoved 表示鼠标移动事件 # 这里我们使用相对移动,也可以使用绝对坐标 CGEventCreateMouseEvent event = Quartz.CGEventCreateMouseEvent( None, Quartz.kCGEventMouseMoved, (current_point.x + dx, current_point.y + dy), Quartz.kCGMouseButtonLeft # 通常用左键作为按钮状态,移动事件可忽略 ) # 3. 发布事件到系统 Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) # 释放事件对象 (在Python中通常由GC管理,但显式释放是好习惯) # del event def jitter_mouse(pixels=2): """ 让鼠标在当前位置附近随机抖动一下。 这是一种更隐蔽的移动方式。 """ dx = random.randint(-pixels, pixels) dy = random.randint(-pixels, pixels) # 避免原地不动 while dx == 0 and dy == 0: dx = random.randint(-pixels, pixels) dy = random.randint(-pixels, pixels) move_mouse(dx, dy) def smooth_move(start_x, start_y, end_x, end_y, steps=10, interval=0.01): """ 模拟一个平滑的鼠标移动轨迹,从起点到终点。 这比瞬间跳变更加“人性化”,但也会更频繁地重置休眠计时器。 """ for i in range(steps + 1): ratio = i / steps x = start_x * (1 - ratio) + end_x * ratio y = start_y * (1 - ratio) + end_y * ratio # 使用绝对坐标移动 event = Quartz.CGEventCreateMouseEvent( None, Quartz.kCGEventMouseMoved, (x, y), Quartz.kCGMouseButtonLeft ) Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) time.sleep(interval)

关键点解析:

  1. CGEventCreateMouseEvent参数

    • 第一个参数None表示创建新事件,而非基于现有事件。
    • 第二个参数是事件类型,kCGEventMouseMoved是移动,还有kCGEventLeftMouseDown等用于模拟点击。
    • 第三个参数是目标坐标(x, y)。这里示例用了相对移动的计算方式,也可以直接用绝对坐标。使用绝对坐标时,需要注意坐标系原点在屏幕左下角(Quartz 坐标系),而非左上角。
    • 第四个参数是鼠标按钮状态,对于移动事件通常设为kCGMouseButtonLeft即可。
  2. CGEventPost的 Tap 位置kCGHIDEventTap表示将事件发布到系统的人机接口设备事件流的最前端,模拟的输入会像真实硬件输入一样被系统处理。这是最关键的一步。

  3. 移动策略:简单的jitter_mouse(随机抖动)是最常用且不易察觉的方式。smooth_move虽然更真实,但因为它是一个连续过程,在移动期间会持续产生事件,可能更耗电(尽管微不足道),且实现稍复杂。原项目可能采用了更简单的周期性微小移动。

3.2 权限处理与用户引导

这是 macOS 安全机制下的一个必过关卡。从 macOS 10.14 (Mojave) 开始,严格的应用沙盒和隐私控制要求应用在访问辅助功能(Accessibility)API 前,必须获得用户明确授权。

如何在代码中检测和处理?

import sys import subprocess def check_accessibility_permission(): """ 检查当前应用是否已获得辅助功能权限。 这是一个近似检查,并非100%准确,但通常有效。 """ # 尝试执行一个需要辅助功能权限的操作,比如获取前台应用信息 script = ''' tell application "System Events" name of first application process whose frontmost is true end tell ''' try: # 使用 osascript 执行 AppleScript subprocess.run(['osascript', '-e', script], check=True, capture_output=True, timeout=2) return True except (subprocess.CalledProcessError, subprocess.TimeoutExpired): # 如果失败,很可能没有权限 return False def prompt_for_permission(): """ 引导用户去系统设置中开启权限。 这是最规范的做法,无法通过代码直接绕过。 """ print("⚠️ 此工具需要「辅助功能」权限来模拟鼠标移动。") print("请按以下步骤操作:") print("1. 打开「系统设置」>「隐私与安全性」>「辅助功能」。") print("2. 点击左下角锁图标并输入密码解锁。") print("3. 在右侧列表中找到本终端或脚本运行器(如 Terminal, iTerm2, VS Code 等),并勾选它。") print("4. 如果找不到,可以尝试先运行一次本工具,失败后它可能会出现在列表中。") print("5. 设置完成后,请重新运行本工具。") print("\n你也可以运行以下命令快速打开对应设置页:") print(" open \"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility\"") input("按回车键继续...") # 尝试打开系统设置页面 subprocess.run(['open', 'x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility'])

在工具的主函数开始处,应该先调用check_accessibility_permission(),如果返回False,则调用prompt_for_permission()并退出,引导用户完成授权。这是负责任的开源工具应有的行为。

3.3 命令行参数解析与守护进程

一个友好的 CLI 工具离不开清晰的参数解析。Python 的argparse库是标准选择。

def main(): parser = argparse.ArgumentParser(description='防止 macOS 系统休眠的鼠标移动工具。') parser.add_argument('-i', '--interval', type=float, default=30.0, help='鼠标移动间隔时间(秒),默认 30 秒。') parser.add_argument('-p', '--pixels', type=int, default=1, help='每次移动的像素距离,默认 1 像素。') parser.add_argument('-d', '--duration', type=float, default=0, help='工具运行总时长(秒),0 表示无限运行,默认 0。') parser.add_argument('-m', '--mode', choices=['jitter', 'horizontal', 'circular'], default='jitter', help='移动模式:jitter(随机抖动,默认), horizontal(水平往复), circular(屏幕边缘圆周)。') parser.add_argument('--daemon', action='store_true', help='以守护进程模式运行,在后台运行。') args = parser.parse_args() # 检查权限 if not check_accessibility_permission(): prompt_for_permission() sys.exit(1) print(f"开始运行,每隔 {args.interval} 秒移动鼠标 {args.pixels} 像素。") print("按 Ctrl+C 终止程序。") start_time = time.time() try: while True: if args.duration > 0 and (time.time() - start_time) > args.duration: print("运行时间到达,程序退出。") break # 根据模式移动鼠标 if args.mode == 'jitter': jitter_mouse(args.pixels) elif args.mode == 'horizontal': # 实现水平往复移动逻辑 pass elif args.mode == 'circular': # 实现圆周移动逻辑 pass time.sleep(args.interval) except KeyboardInterrupt: print("\n程序被用户中断。")

对于“守护进程”模式 (--daemon),在 Unix-like 系统中,通常涉及双fork、脱离终端会话、重定向标准流等操作。但在 Python 中,一个更简单且跨平台的方法是结合nohup&在 Shell 中运行,或者在代码里使用daemon线程/进程。对于这个小工具,更常见的做法是让用户自己用nohup python move_mouse.py &或者创建一个launchd/plist服务来后台运行,而不是在工具内实现复杂的守护进程逻辑,这保持了工具的简洁性。

4. 从源码到可分发工具:打包与部署实践

让用户方便地使用,而不仅仅是克隆一个 Python 仓库,是提升项目可用性的关键。

4.1 使用py2apppyinstaller打包

虽然直接运行.py文件对开发者很友好,但对普通用户来说,一个双击即可运行的.app应用或者独立的可执行文件更有吸引力。

  • 使用py2app(macOS 专属)py2app可以将 Python 脚本打包成独立的 macOS 应用捆绑包 (.app)。你需要创建一个setup.py文件:

    from setuptools import setup APP = ['move_mouse.py'] DATA_FILES = [] OPTIONS = { 'argv_emulation': False, 'packages': ['pyobjc'], 'plist': { 'CFBundleName': 'Move Mouse', 'CFBundleDisplayName': 'Move Mouse', 'CFBundleIdentifier': 'com.anshinfo.move-mouse', 'CFBundleVersion': '1.0.0', 'NSHumanReadableCopyright': '© 2023 Ansh Info', 'LSUIElement': True, # 这是一个后台应用,不显示在 Dock } } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )

    然后运行python setup.py py2app进行打包。打包后的.app在首次运行时,系统会弹出辅助功能权限请求,用户授权后即可使用。注意:打包后的应用体积会包含 Python 解释器和依赖库,体积较大(几十MB到上百MB),但用户体验最好。

  • 使用PyInstaller(跨平台)PyInstaller可以生成单个可执行文件。命令相对简单:

    pip install pyinstaller pyinstaller --onefile --windowed --name MoveMouse move_mouse.py

    --windowed在 macOS 上会创建一个没有控制台窗口的.app包。--onefile生成单个文件。PyInstaller 对 PyObjC 的支持有时需要额外配置,可能需要通过--hidden-import手动指定导入pyobjc的相关模块。

实操心得:在 macOS 上,py2app对原生应用的支持(如.app结构、Info.plist配置)通常更地道。而PyInstaller的跨平台特性是其主要优势。对于这个特定工具,如果目标用户全是 macOS,我推荐py2app。打包后务必在另一台干净的机器上测试权限申请和功能是否正常,这是检验打包成功与否的金标准。

4.2 通过 Homebrew 分发

对于 macOS 开发者社区,Homebrew 是最受欢迎的包管理器。将你的工具制作成一个 Homebrew Tap(个人仓库)或提交到官方仓库(难度较大),可以极大方便用户安装。

  1. 创建 Formula:你需要编写一个 Ruby 文件(Formula),定义如何下载源码、安装依赖、安装软件。

    # move-mouse-macOS.rb class MoveMouseMacos < Formula desc "A tiny tool to prevent sleep by moving mouse on macOS" homepage "https://github.com/ansh-info/move-mouse-macOS" url "https://github.com/ansh-info/move-mouse-macOS/archive/refs/tags/v1.0.0.tar.gz" sha256 "计算出的源码包SHA256" license "MIT" depends_on "python@3.9" def install # 将脚本安装到 bin 目录 bin.install "move_mouse.py" => "move-mouse" end test do # 简单的测试,例如检查版本号 assert_match "move-mouse", shell_output("#{bin}/move-mouse --help") end end
  2. 创建 Tap:在你的 GitHub 上创建一个名为homebrew-<yourname>的仓库(例如homebrew-tap),将 Formula 文件放入Formula目录。用户就可以通过brew install <yourname>/tap/move-mouse-macos来安装了。

  3. 安装与权限:通过 Homebrew 安装的 CLI 工具,在首次运行时同样会触发辅助功能权限请求。你可以在 Formula 的caveats部分添加提示信息,引导用户。

这种方式分发的是源码,依赖用户的本地 Python 环境,安装速度快,也更符合 Homebrew 哲学。

4.3 项目结构与代码质量

一个优秀的开源项目,除了核心功能,清晰的结构和良好的代码实践也至关重要。ansh-info/move-mouse-macOS项目应该包含:

move-mouse-macOS/ ├── README.md # 项目说明、安装、使用教程 ├── LICENSE # 开源许可证(如 MIT) ├── requirements.txt # Python 依赖声明(如 pyobjc) ├── move_mouse.py # 主程序脚本 ├── setup.py # 打包配置(如果选择打包) ├── scripts/ # 可能包含的辅助脚本 │ └── install.sh # 便捷安装脚本 └── tests/ # 单元测试(可选但推荐) └── test_mouse.py

README.md中,应详细说明功能、安装方法(pip, brew, 直接下载)、使用方法、参数详解、权限配置步骤以及常见问题。好的文档能减少 80% 的 issues。

5. 高级用法、场景扩展与避坑指南

掌握了基础用法后,我们可以探索一些更高级的应用场景,并总结那些“踩过坑才知道”的经验。

5.1 集成到自动化工作流

这个工具的真正威力在于与其他脚本结合。

  • 场景一:长时间构建/测试:在 CI/CD 脚本中,在启动一个耗时很长的编译或测试套件之前,启动此工具,结束后pkill -f move_mouse.py

    #!/bin/bash # start_build.sh python3 /path/to/move_mouse.py --interval 60 --duration 7200 & # 运行2小时 MOUSE_PID=$! # 执行你的长时间任务 make build_all run_extensive_tests # 任务结束,停止鼠标移动 kill $MOUSE_PID
  • 场景二:远程演示/挂机:在进行远程屏幕共享演示时,开启此工具可以防止因自己长时间不操作而导致屏幕变暗,影响观众体验。

  • 场景三:配合 AppleScript 控制特定应用:你可以写一个 AppleScript,在检测到某个应用(如虚拟机、下载器)在前台时,才启用鼠标移动,其他时候停止,更加智能。

    tell application "System Events" if (name of first application process whose frontmost is true) contains "VirtualBox" then -- 调用 Python 脚本 do shell script "python3 ~/Tools/move_mouse.py --interval 30 &" else -- 停止脚本 do shell script "pkill -f move_mouse.py" end if end tell

5.2 常见问题与排查技巧

  1. 权限问题(最常见)

    • 症状:运行脚本后鼠标不动,没有任何错误提示,或者系统没有任何反应。
    • 排查
      • 运行后,立即打开“系统设置”>“隐私与安全性”>“辅助功能”,检查你的终端应用(如 Terminal, iTerm2, VS Code)是否已被勾选。如果没有,勾选它。
      • 如果已经勾选但还是不行,尝试取消勾选,再重新勾选。有时系统权限缓存会导致问题。
      • 如果你是通过.app运行,请检查.app本身是否在辅助功能列表中。
    • 技巧:在脚本开头加入明显的权限检查提示,可以避免用户困惑。
  2. 鼠标移动干扰了真实操作

    • 症状:在打字或进行精细点击时,鼠标突然自己动了一下,导致点错位置。
    • 解决
      • 减小移动像素:将-p参数设为 1。1个像素的移动几乎无法被肉眼察觉,但足以重置系统空闲计时器。
      • 增加移动间隔:将-i参数设为 60 或 120。macOS 的默认显示器休眠时间通常是几分钟,间隔设为 30-60 秒足够安全。
      • 使用“智能”模式(需自行实现):可以扩展工具,使其在检测到用户最近有真实鼠标/键盘事件时,暂停模拟移动一段时间。
  3. 工具在后台意外退出

    • 症状:以nohup ... &方式运行后,过一段时间发现进程不见了。
    • 排查
      • 检查日志:使用nohup python3 move_mouse.py > mouse.log 2>&1 &将输出重定向到日志文件,查看是否有错误信息。
      • 系统睡眠:确保工具运行时,系统本身没有被设置为“永不睡眠”以外的模式。如果系统进入睡眠,所有进程都会挂起。
      • 被系统杀死:在极端资源紧张时,系统可能会终止后台进程。这在小工具上不常见。
    • 更可靠的方案:对于需要长期稳定运行的情况,建议使用launchd创建用户守护进程。创建一个~/Library/LaunchAgents/com.user.move-mouse.plist文件:
      <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.user.move-mouse</string> <key>ProgramArguments</key> <array> <string>/usr/bin/python3</string> <string>/path/to/move_mouse.py</string> <string>--interval</string> <string>45</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/tmp/move-mouse.log</string> <key>StandardErrorPath</key> <string>/tmp/move-mouse.err</string> </dict> </plist>
      然后使用launchctl load ~/Library/LaunchAgents/com.user.move-mouse.plist加载它。这样它会在登录时自动启动,并在异常退出后重启。
  4. 多显示器下的坐标问题

    • 问题:如果你的系统连接了多个显示器,使用绝对坐标移动鼠标时,需要正确处理跨屏幕的坐标系统。Quartz 的坐标系是跨越所有显示器的单一坐标系。
    • 解决:在实现“圆周移动”或“对角线移动”等模式时,最好先通过Quartz.CGGetActiveDisplayList获取所有显示器的信息,计算出一个安全的移动范围(例如在主显示器中央的一个小矩形内移动),避免鼠标跳到其他屏幕干扰工作。

5.3 安全与隐私考量

这是一个需要特别强调的部分。任何模拟用户输入的工具,从本质上讲都具备一定的“自动化”能力,因此必须谨慎对待。

  • 开源透明ansh-info/move-mouse-macOS作为开源项目,所有代码公开可查,这是建立信任的基础。用户可以看到它除了移动鼠标,没有做任何其他事情(如记录键盘、截屏)。
  • 权限最小化:它只请求“辅助功能”权限,这是完成其功能所必需的最小权限。在授权时,用户应清楚知道是授予了哪个具体的应用(终端或打包后的.app)。
  • 警惕类似闭源工具:对于网络上功能类似的闭源工具,尤其是那些要求输入密码或授予“完全磁盘访问权限”的,应保持高度警惕。恶意软件可能利用此类权限做坏事。
  • 个人建议:只从可信来源(如知名开源社区、GitHub)获取和使用此类工具。对于move-mouse-macOS这类小工具,我强烈建议有能力的使用者直接阅读源码,确认无误后自己运行,而不是下载来路不明的预编译二进制文件。

6. 总结与个人实践体会

回顾整个项目,ansh-info/move-mouse-macOS是一个典型的问题驱动型开发范例。它瞄准了一个非常具体的用户痛点,并用简洁有效的技术方案予以解决。通过剖析它,我们不仅学会了一个防止 macOS 休眠的技巧,更深入了解了 macOS 的事件系统、安全权限模型、Python 与原生系统的交互,以及一个完整 CLI 工具从设计、开发到打包、分发的全流程。

在我个人的使用中,我更喜欢将它作为一个模块集成到我的自动化脚本里,而不是一个常驻后台的守护进程。例如,我有一个每周运行一次的数据备份脚本,需要运行超过一个小时,我就会在脚本里调用这个工具。这样,它的生命周期和任务绑定,用完即走,非常干净。

最后分享一个我自己的优化变种:我写了一个增强版,除了随机抖动,还会在移动时轻微改变光标的颜色(通过Quartz.CGDisplaySetCursor相关 API,但这需要更多权限且更复杂),或者与系统音量/亮度的小幅周期性波动结合,形成一套更难以察觉的“系统保活组合拳”。当然,这超出了原项目的范畴,但正是基于对原项目原理的深刻理解,才能进行这样的创新和扩展。

如果你也受困于 macOS 的自动休眠,不妨试试这个思路,或者直接使用这个开源工具。理解其原理后,你完全可以按照自己的需求定制它,让它更好地为你服务。这就是开源和脚本化工具的魅力所在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 8:00:31

navi性能优化终极指南:大规模速查表的高效加载策略

navi性能优化终极指南&#xff1a;大规模速查表的高效加载策略 【免费下载链接】navi An interactive cheatsheet tool for the command-line 项目地址: https://gitcode.com/gh_mirrors/na/navi &#x1f680; navi 是一个强大的交互式命令行速查表工具&#xff0c;但当…

作者头像 李华
网站建设 2026/5/9 7:50:36

3秒解锁网盘资源:baidupankey智能提取码查询工具完全指南

3秒解锁网盘资源&#xff1a;baidupankey智能提取码查询工具完全指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗&#xff1f;每次遇到需要输入提取码的资源&#xff0c;都需要在多…

作者头像 李华
网站建设 2026/5/9 7:50:33

AI编码规则:从语法检查到语义守护的代码质量革命

1. 项目概述&#xff1a;AI驱动的代码规范守护者最近在GitHub上看到一个挺有意思的项目&#xff0c;叫aiagentwithdhruv/ai-coding-rules。光看名字&#xff0c;你可能会觉得这又是一个普通的代码规范检查工具&#xff0c;比如ESLint或者Prettier的某个配置集。但如果你深入了解…

作者头像 李华
网站建设 2026/5/9 7:45:03

SparseDrive运行记录

文章目录一.安装环境二.运行一.安装环境 nvcc -V conda create -n sparsedrive python3.8 -y conda activate sparsedrive pip install torch2.0.0 torchvision0.15.1 torchaudio2.0.1 --index-url https://download.pytorch.org/whl/cu118 &#xff08;必须cuda11.6及以上&a…

作者头像 李华