[{"data":1,"prerenderedAt":972},["ShallowReactive",2],{"post-zh-macos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop":3,"surround-zh-blog\u002Fzh\u002Fblog\u002Fmacos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop.md":959},{"id":4,"title":5,"body":6,"canonical":24,"category":945,"date":133,"description":946,"extension":947,"image":948,"meta":949,"navigation":343,"path":950,"seo":951,"slug":952,"status":953,"stem":954,"tags":955,"translationSlug":952,"__hash__":958},"blog\u002Fzh\u002Fblog\u002Fmacos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop.md","macOS Golden Gate 27.0 (Beta 2) appstoreagent 100% CPU 故障排查与 SIGSTOP 挂起解决方案",{"type":7,"value":8,"toc":932},"minimark",[9,14,18,76,83,86,90,93,121,124,161,166,202,204,208,218,225,242,245,247,251,254,261,290,297,662,664,668,671,675,682,798,816,820,846,867,871,874,928],[10,11,13],"h2",{"id":12},"_1-故障现象","1. 故障现象",[15,16,17],"p",{},"在升级至 macOS Golden Gate 27.0 Developer Beta 2 (Build: 26A5368g) 后，MacBook 开始严重发热，电池电量迅速消耗。通过终端执行进程状态检索：",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-bash shiki shiki-themes github-light github-dark","$ ps aux | grep appstoreagent\n\u003Cusername>       19002 107.0  0.1 488771680  25088   ??  R    12:20AM  14:55.36 \u002FSystem\u002FLibrary\u002FPrivateFrameworks\u002FAppStoreDaemon.framework\u002FSupport\u002Fappstoreagent\n","bash","",[26,27,28,54],"code",{"__ignoreMap":24},[29,30,33,37,41,44,48,51],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"sScJk","$",[29,38,40],{"class":39},"sZZnC"," ps",[29,42,43],{"class":39}," aux",[29,45,47],{"class":46},"szBVR"," |",[29,49,50],{"class":35}," grep",[29,52,53],{"class":39}," appstoreagent\n",[29,55,57,60,64,67,70,73],{"class":31,"line":56},2,[29,58,59],{"class":46},"\u003C",[29,61,63],{"class":62},"sVt8B","username",[29,65,66],{"class":46},">",[29,68,69],{"class":62},"       19002 107.0  0.1 488771680  25088   ",[29,71,72],{"class":46},"??",[29,74,75],{"class":62},"  R    12:20AM  14:55.36 \u002FSystem\u002FLibrary\u002FPrivateFrameworks\u002FAppStoreDaemon.framework\u002FSupport\u002Fappstoreagent\n",[15,77,78,79,82],{},"守护进程 ",[26,80,81],{},"appstoreagent"," 在完全没有运行 App Store 客户端的情况下，持续强占单核 100% 以上 of CPU 资源，且手动强杀（Kill）后会被立刻拉起，继续满载空转。",[84,85],"hr",{},[10,87,89],{"id":88},"_2-日志追溯与根因定位","2. 日志追溯与根因定位",[15,91,92],{},"为锁定真实异常，我们通过系统的统一日志控制台（Unified Logging System）针对该进程执行特征日志抓取：",[19,94,96],{"className":21,"code":95,"language":23,"meta":24,"style":24},"$ \u002Fusr\u002Fbin\u002Flog show --predicate 'process == \"appstoreagent\" and eventMessage contains \"recent_launch_times\"' --last 5m\n",[26,97,98],{"__ignoreMap":24},[29,99,100,102,105,108,112,115,118],{"class":31,"line":32},[29,101,36],{"class":35},[29,103,104],{"class":39}," \u002Fusr\u002Fbin\u002Flog",[29,106,107],{"class":39}," show",[29,109,111],{"class":110},"sj4cs"," --predicate",[29,113,114],{"class":39}," 'process == \"appstoreagent\" and eventMessage contains \"recent_launch_times\"'",[29,116,117],{"class":110}," --last",[29,119,120],{"class":39}," 5m\n",[15,122,123],{},"日志抓取输出如下：",[19,125,127],{"className":21,"code":126,"language":23,"meta":24,"style":24},"2026-07-04 00:34:55.462135+0800 0x7969e    Error       0x0                  19002  0    appstoreagent: (libsqlite3.dylib) [com.apple.libsqlite3:logging] no such column: active_launch_events.recent_launch_times in \"SELECT active_launch_events.ROWID, active_launch_events.bundle_id, active_launch_events.containing_bundle_id, active_launch_events.event_source, active_launch_events.is_extension, active_launch_events.launch_end_time, active_launch_events.launch_start_time, active_launch_events.recent_launch_times, active_launch_events.timestamp, active_launch_events.payload FROM active_launch_events\"\n",[26,128,129],{"__ignoreMap":24},[29,130,131,134,137,140,143,146,149,152,155,158],{"class":31,"line":32},[29,132,133],{"class":35},"2026-07-04",[29,135,136],{"class":39}," 00:34:55.462135+0800",[29,138,139],{"class":110}," 0x7969e",[29,141,142],{"class":39},"    Error",[29,144,145],{"class":110},"       0x0",[29,147,148],{"class":110},"                  19002",[29,150,151],{"class":110},"  0",[29,153,154],{"class":39},"    appstoreagent:",[29,156,157],{"class":62}," (libsqlite3.dylib) [com.apple.libsqlite3:logging] no such column: active_launch_events.recent_launch_times in ",[29,159,160],{"class":39},"\"SELECT active_launch_events.ROWID, active_launch_events.bundle_id, active_launch_events.containing_bundle_id, active_launch_events.event_source, active_launch_events.is_extension, active_launch_events.launch_end_time, active_launch_events.launch_start_time, active_launch_events.recent_launch_times, active_launch_events.timestamp, active_launch_events.payload FROM active_launch_events\"\n",[162,163,165],"h3",{"id":164},"异常分析","异常分析：",[167,168,169,185],"ul",{},[170,171,172,176,177,180,181,184],"li",{},[173,174,175],"strong",{},"异常根源","：macOS Golden Gate 27.0 Beta 2 在内存中动态构建或迁移安全数据库 Schema 时，遗漏了向 ",[26,178,179],{},"active_launch_events"," 物理表填充 ",[26,182,183],{},"recent_launch_times"," 字段的升级迁移逻辑。",[170,186,187,190,191,194,195,197,198,201],{},[173,188,189],{},"死循环成因","：由于缺少该字段，底层的 SQLite 查询不断抛出 ",[26,192,193],{},"no such column"," 异常。",[26,196,81],{}," 在捕获此异常后触发了",[173,199,200],{},"无延迟、高频的立即重试机制","，从而陷入“查询-失败-重试”的死循环，瞬间吃满单核 CPU。",[84,203],{},[10,205,207],{"id":206},"_3-为什么常规-kill-无法解决","3. 为什么常规 Kill 无法解决？",[15,209,210,211,213,214,217],{},"在 macOS 中，",[26,212,81],{}," 是由系统根守护进程 ",[26,215,216],{},"launchd"," 管理的 User Agent。",[15,219,220,221,224],{},"当我们对其执行 ",[26,222,223],{},"kill -9"," 强杀时：",[226,227,228,231,236],"ol",{},[170,229,230],{},"进程退出，系统短暂释放 CPU。",[170,232,233,235],{},[26,234,216],{}," 监测到该守护服务非预期退出，立好重新将其拉起。",[170,237,238,239,241],{},"新拉起的 ",[26,240,81],{}," 实例启动，再次执行初始化数据库查询，重新触发 Schema 缺失错误，CPU 再次飙升至 100%。",[15,243,244],{},"因此，强杀进程只会导致系统频繁进行“拉起-崩溃-再拉起”的死循环，反而会带来额外的系统进程开销与海量日志堆积。",[84,246],{},[10,248,250],{"id":249},"_4-优雅的-sigstop-sigcont-解决方案","4. 优雅的 SIGSTOP \u002F SIGCONT 解决方案",[15,252,253],{},"由于系统只读卷受到 SIP（系统完整性保护）的严格保护，普通用户无法直接修改底层数据库的 Schema，我们只能通过行为干预实现临时缓解。",[15,255,256,257,260],{},"这里我们使用信号量控制策略：",[173,258,259],{},"挂起进程（Process Suspension）","。",[167,262,263,284],{},[170,264,265,266,269,270,273,274,277,278,280,281,260],{},"发送 ",[26,267,268],{},"SIGSTOP"," 信号：使进程转为 ",[26,271,272],{},"T"," (Stopped) 状态。此时，操作系统停止分配 CPU 周期给该进程，其 ",[173,275,276],{},"CPU 占用率瞬间降至 0%","。最关键的是，",[26,279,216],{}," 仍认为该进程处于存活（Alive）状态，",[173,282,283],{},"不会触发重新拉起机制",[170,285,265,286,289],{},[26,287,288],{},"SIGCONT"," 信号：当我们需要使用 App Store 时，发送该信号可立即使其恢复运行，保障应用的正常下载与更新。",[15,291,292,293,296],{},"我们编写了一个 Python 3 守护进程脚本 ",[26,294,295],{},"guardian.py","，用于自动化这一控制逻辑：",[19,298,302],{"className":299,"code":300,"language":301,"meta":24,"style":24},"language-python shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fenv python3\nimport subprocess\nimport time\nimport os\nimport sys\nimport signal\n\ndef get_pids(process_name):\n    \"\"\"获取指定进程名的所有 PID\"\"\"\n    try:\n        output = subprocess.check_output([\"pgrep\", \"-x\", process_name], text=True)\n        return [int(pid.strip()) for pid in output.strip().split(\"\\n\") if pid.strip()]\n    except subprocess.CalledProcessError:\n        return []\n\ndef is_app_store_running():\n    \"\"\"检查 App Store GUI 客户端是否正在运行\"\"\"\n    return len(get_pids(\"App Store\")) > 0\n\ndef get_process_state(pid):\n    \"\"\"获取进程状态。返回 'T' 代表已挂起，其他代表运行中\"\"\"\n    try:\n        output = subprocess.check_output([\"ps\", \"-o\", \"state\", \"-p\", str(pid)], text=True)\n        lines = output.strip().split(\"\\n\")\n        if len(lines) > 1:\n            return lines[1].strip()\n    except subprocess.CalledProcessError:\n        pass\n    return None\n\ndef main():\n    print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] appstoreagent guardian daemon started.\")\n    \n    while True:\n        try:\n            agent_pids = get_pids(\"appstoreagent\")\n            app_store_active = is_app_store_running()\n            \n            for pid in agent_pids:\n                state = get_process_state(pid)\n                if not state:\n                    continue\n                \n                # 如果 App Store 打开了，并且 appstoreagent 处于挂起状态 (T) -> 恢复它\n                if app_store_active:\n                    if 'T' in state:\n                        print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] App Store is running. Resuming appstoreagent (PID {pid})...\")\n                        os.kill(pid, signal.SIGCONT)\n                # 如果 App Store 关闭了，且 appstoreagent 没被挂起 -> 挂起它\n                else:\n                    if 'T' not in state:\n                        print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] App Store is closed. Suspending appstoreagent (PID {pid}) to save CPU...\")\n                        os.kill(pid, signal.SIGSTOP)\n                        \n        except Exception as e:\n            print(f\"Error in guardian loop: {e}\", file=sys.stderr)\n            \n        time.sleep(5)\n\nif __name__ == \"__main__\":\n    main()\n","python",[26,303,304,309,314,320,326,332,338,345,351,357,363,369,375,381,387,392,398,404,410,415,421,427,432,438,444,450,456,461,467,473,478,484,490,496,502,508,514,520,526,532,538,544,550,556,562,568,574,580,586,592,598,604,610,616,622,628,634,639,645,650,656],{"__ignoreMap":24},[29,305,306],{"class":31,"line":32},[29,307,308],{},"#!\u002Fusr\u002Fbin\u002Fenv python3\n",[29,310,311],{"class":31,"line":56},[29,312,313],{},"import subprocess\n",[29,315,317],{"class":31,"line":316},3,[29,318,319],{},"import time\n",[29,321,323],{"class":31,"line":322},4,[29,324,325],{},"import os\n",[29,327,329],{"class":31,"line":328},5,[29,330,331],{},"import sys\n",[29,333,335],{"class":31,"line":334},6,[29,336,337],{},"import signal\n",[29,339,341],{"class":31,"line":340},7,[29,342,344],{"emptyLinePlaceholder":343},true,"\n",[29,346,348],{"class":31,"line":347},8,[29,349,350],{},"def get_pids(process_name):\n",[29,352,354],{"class":31,"line":353},9,[29,355,356],{},"    \"\"\"获取指定进程名的所有 PID\"\"\"\n",[29,358,360],{"class":31,"line":359},10,[29,361,362],{},"    try:\n",[29,364,366],{"class":31,"line":365},11,[29,367,368],{},"        output = subprocess.check_output([\"pgrep\", \"-x\", process_name], text=True)\n",[29,370,372],{"class":31,"line":371},12,[29,373,374],{},"        return [int(pid.strip()) for pid in output.strip().split(\"\\n\") if pid.strip()]\n",[29,376,378],{"class":31,"line":377},13,[29,379,380],{},"    except subprocess.CalledProcessError:\n",[29,382,384],{"class":31,"line":383},14,[29,385,386],{},"        return []\n",[29,388,390],{"class":31,"line":389},15,[29,391,344],{"emptyLinePlaceholder":343},[29,393,395],{"class":31,"line":394},16,[29,396,397],{},"def is_app_store_running():\n",[29,399,401],{"class":31,"line":400},17,[29,402,403],{},"    \"\"\"检查 App Store GUI 客户端是否正在运行\"\"\"\n",[29,405,407],{"class":31,"line":406},18,[29,408,409],{},"    return len(get_pids(\"App Store\")) > 0\n",[29,411,413],{"class":31,"line":412},19,[29,414,344],{"emptyLinePlaceholder":343},[29,416,418],{"class":31,"line":417},20,[29,419,420],{},"def get_process_state(pid):\n",[29,422,424],{"class":31,"line":423},21,[29,425,426],{},"    \"\"\"获取进程状态。返回 'T' 代表已挂起，其他代表运行中\"\"\"\n",[29,428,430],{"class":31,"line":429},22,[29,431,362],{},[29,433,435],{"class":31,"line":434},23,[29,436,437],{},"        output = subprocess.check_output([\"ps\", \"-o\", \"state\", \"-p\", str(pid)], text=True)\n",[29,439,441],{"class":31,"line":440},24,[29,442,443],{},"        lines = output.strip().split(\"\\n\")\n",[29,445,447],{"class":31,"line":446},25,[29,448,449],{},"        if len(lines) > 1:\n",[29,451,453],{"class":31,"line":452},26,[29,454,455],{},"            return lines[1].strip()\n",[29,457,459],{"class":31,"line":458},27,[29,460,380],{},[29,462,464],{"class":31,"line":463},28,[29,465,466],{},"        pass\n",[29,468,470],{"class":31,"line":469},29,[29,471,472],{},"    return None\n",[29,474,476],{"class":31,"line":475},30,[29,477,344],{"emptyLinePlaceholder":343},[29,479,481],{"class":31,"line":480},31,[29,482,483],{},"def main():\n",[29,485,487],{"class":31,"line":486},32,[29,488,489],{},"    print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] appstoreagent guardian daemon started.\")\n",[29,491,493],{"class":31,"line":492},33,[29,494,495],{},"    \n",[29,497,499],{"class":31,"line":498},34,[29,500,501],{},"    while True:\n",[29,503,505],{"class":31,"line":504},35,[29,506,507],{},"        try:\n",[29,509,511],{"class":31,"line":510},36,[29,512,513],{},"            agent_pids = get_pids(\"appstoreagent\")\n",[29,515,517],{"class":31,"line":516},37,[29,518,519],{},"            app_store_active = is_app_store_running()\n",[29,521,523],{"class":31,"line":522},38,[29,524,525],{},"            \n",[29,527,529],{"class":31,"line":528},39,[29,530,531],{},"            for pid in agent_pids:\n",[29,533,535],{"class":31,"line":534},40,[29,536,537],{},"                state = get_process_state(pid)\n",[29,539,541],{"class":31,"line":540},41,[29,542,543],{},"                if not state:\n",[29,545,547],{"class":31,"line":546},42,[29,548,549],{},"                    continue\n",[29,551,553],{"class":31,"line":552},43,[29,554,555],{},"                \n",[29,557,559],{"class":31,"line":558},44,[29,560,561],{},"                # 如果 App Store 打开了，并且 appstoreagent 处于挂起状态 (T) -> 恢复它\n",[29,563,565],{"class":31,"line":564},45,[29,566,567],{},"                if app_store_active:\n",[29,569,571],{"class":31,"line":570},46,[29,572,573],{},"                    if 'T' in state:\n",[29,575,577],{"class":31,"line":576},47,[29,578,579],{},"                        print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] App Store is running. Resuming appstoreagent (PID {pid})...\")\n",[29,581,583],{"class":31,"line":582},48,[29,584,585],{},"                        os.kill(pid, signal.SIGCONT)\n",[29,587,589],{"class":31,"line":588},49,[29,590,591],{},"                # 如果 App Store 关闭了，且 appstoreagent 没被挂起 -> 挂起它\n",[29,593,595],{"class":31,"line":594},50,[29,596,597],{},"                else:\n",[29,599,601],{"class":31,"line":600},51,[29,602,603],{},"                    if 'T' not in state:\n",[29,605,607],{"class":31,"line":606},52,[29,608,609],{},"                        print(f\"[{time.strftime('%Y-%m-%d %H:%M:%S')}] App Store is closed. Suspending appstoreagent (PID {pid}) to save CPU...\")\n",[29,611,613],{"class":31,"line":612},53,[29,614,615],{},"                        os.kill(pid, signal.SIGSTOP)\n",[29,617,619],{"class":31,"line":618},54,[29,620,621],{},"                        \n",[29,623,625],{"class":31,"line":624},55,[29,626,627],{},"        except Exception as e:\n",[29,629,631],{"class":31,"line":630},56,[29,632,633],{},"            print(f\"Error in guardian loop: {e}\", file=sys.stderr)\n",[29,635,637],{"class":31,"line":636},57,[29,638,525],{},[29,640,642],{"class":31,"line":641},58,[29,643,644],{},"        time.sleep(5)\n",[29,646,648],{"class":31,"line":647},59,[29,649,344],{"emptyLinePlaceholder":343},[29,651,653],{"class":31,"line":652},60,[29,654,655],{},"if __name__ == \"__main__\":\n",[29,657,659],{"class":31,"line":658},61,[29,660,661],{},"    main()\n",[84,663],{},[10,665,667],{"id":666},"_5-launchd-后台静默守护部署","5. launchd 后台静默守护部署",[15,669,670],{},"为了让该守护进程静默且常驻地在后台执行，我们将其包装为 macOS 的 Launch Agent。",[162,672,674],{"id":673},"_51-创建配置文件","5.1 创建配置文件",[15,676,677,678,681],{},"在本地创建 ",[26,679,680],{},"com.user.appstoreagent-guardian.plist","：",[19,683,687],{"className":684,"code":685,"language":686,"meta":24,"style":24},"language-xml shiki shiki-themes github-light github-dark","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n    \u003Ckey>Label\u003C\u002Fkey>\n    \u003Cstring>com.user.appstoreagent-guardian\u003C\u002Fstring>\n    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>\u002Fusr\u002Fbin\u002Fpython3\u003C\u002Fstring>\n        \u003Cstring>-u\u003C\u002Fstring>\n        \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.py\u003C\u002Fstring>\n    \u003C\u002Farray>\n    \u003Ckey>RunAtLoad\u003C\u002Fkey>\n    \u003Ctrue\u002F>\n    \u003Ckey>KeepAlive\u003C\u002Fkey>\n    \u003Ctrue\u002F>\n    \u003Ckey>StandardOutPath\u003C\u002Fkey>\n    \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.log\u003C\u002Fstring>\n    \u003Ckey>StandardErrorPath\u003C\u002Fkey>\n    \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.err\u003C\u002Fstring>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[26,688,689,694,699,704,709,714,719,724,729,734,739,744,749,754,759,764,768,773,778,783,788,793],{"__ignoreMap":24},[29,690,691],{"class":31,"line":32},[29,692,693],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[29,695,696],{"class":31,"line":56},[29,697,698],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[29,700,701],{"class":31,"line":316},[29,702,703],{},"\u003Cplist version=\"1.0\">\n",[29,705,706],{"class":31,"line":322},[29,707,708],{},"\u003Cdict>\n",[29,710,711],{"class":31,"line":328},[29,712,713],{},"    \u003Ckey>Label\u003C\u002Fkey>\n",[29,715,716],{"class":31,"line":334},[29,717,718],{},"    \u003Cstring>com.user.appstoreagent-guardian\u003C\u002Fstring>\n",[29,720,721],{"class":31,"line":340},[29,722,723],{},"    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n",[29,725,726],{"class":31,"line":347},[29,727,728],{},"    \u003Carray>\n",[29,730,731],{"class":31,"line":353},[29,732,733],{},"        \u003Cstring>\u002Fusr\u002Fbin\u002Fpython3\u003C\u002Fstring>\n",[29,735,736],{"class":31,"line":359},[29,737,738],{},"        \u003Cstring>-u\u003C\u002Fstring>\n",[29,740,741],{"class":31,"line":365},[29,742,743],{},"        \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.py\u003C\u002Fstring>\n",[29,745,746],{"class":31,"line":371},[29,747,748],{},"    \u003C\u002Farray>\n",[29,750,751],{"class":31,"line":377},[29,752,753],{},"    \u003Ckey>RunAtLoad\u003C\u002Fkey>\n",[29,755,756],{"class":31,"line":383},[29,757,758],{},"    \u003Ctrue\u002F>\n",[29,760,761],{"class":31,"line":389},[29,762,763],{},"    \u003Ckey>KeepAlive\u003C\u002Fkey>\n",[29,765,766],{"class":31,"line":394},[29,767,758],{},[29,769,770],{"class":31,"line":400},[29,771,772],{},"    \u003Ckey>StandardOutPath\u003C\u002Fkey>\n",[29,774,775],{"class":31,"line":406},[29,776,777],{},"    \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.log\u003C\u002Fstring>\n",[29,779,780],{"class":31,"line":412},[29,781,782],{},"    \u003Ckey>StandardErrorPath\u003C\u002Fkey>\n",[29,784,785],{"class":31,"line":417},[29,786,787],{},"    \u003Cstring>\u002Fpath\u002Fto\u002Fguardian.err\u003C\u002Fstring>\n",[29,789,790],{"class":31,"line":423},[29,791,792],{},"\u003C\u002Fdict>\n",[29,794,795],{"class":31,"line":429},[29,796,797],{},"\u003C\u002Fplist>\n",[799,800,801],"blockquote",{},[15,802,803,804,807,808,811,812,815],{},"[!WARNING] 请注意将配置文件中的 ",[26,805,806],{},"\u002Fpath\u002Fto\u002Fguardian.py"," 等路径修改为您在本地机器上的绝对路径。并且强烈建议配置 ",[26,809,810],{},"-u"," 参数，这样 Python 进程的日志输出便能够无缓存地立即刷入 ",[26,813,814],{},"guardian.log"," 中。",[162,817,819],{"id":818},"_52-引导并激活服务","5.2 引导并激活服务",[226,821,822,828,834,840],{},[170,823,824,825],{},"给守护脚本赋予可执行权限：",[26,826,827],{},"chmod +x \u002Fpath\u002Fto\u002Fguardian.py",[170,829,830,831],{},"将配置文件复制到用户 Launch Agents 目录：",[26,832,833],{},"cp com.user.appstoreagent-guardian.plist ~\u002FLibrary\u002FLaunchAgents\u002F",[170,835,836,837],{},"使用 launchctl 载入并引导该守护进程：",[26,838,839],{},"launchctl bootstrap gui\u002F$(id -u) ~\u002FLibrary\u002FLaunchAgents\u002Fcom.user.appstoreagent-guardian.plist",[170,841,842,843],{},"验证服务运行状态：",[26,844,845],{},"launchctl print gui\u002F$(id -u)\u002Fcom.user.appstoreagent-guardian",[15,847,848,849,852,853,855,856,859,860,862,863,866],{},"若显示 ",[26,850,851],{},"state = running"," 且指定了正确的运行 PID，则代表部署成功。此时，当 App Store 处于关闭状态时，您会看到 ",[26,854,81],{}," 在 ",[26,857,858],{},"ps aux"," 中的状态变为了 ",[26,861,272],{}," (Stopped)，CPU 使用率稳稳保持在 ",[173,864,865],{},"0.0%","。而当您双击打开 App Store 时，它会瞬间被唤醒提供正常服务。",[162,868,870],{"id":869},"_53-服务卸载","5.3 服务卸载",[15,872,873],{},"当未来 Apple 发布下一 Beta 版本并修复了该 Schema 迁移 Bug 时，您可以通过以下命令彻底移除此临时守护进程：",[19,875,877],{"className":21,"code":876,"language":23,"meta":24,"style":24},"# 停止后台服务\nlaunchctl bootout gui\u002F$(id -u)\u002Fcom.user.appstoreagent-guardian\n\n# 清理配置文件\nrm ~\u002FLibrary\u002FLaunchAgents\u002Fcom.user.appstoreagent-guardian.plist\n",[26,878,879,885,911,915,920],{"__ignoreMap":24},[29,880,881],{"class":31,"line":32},[29,882,884],{"class":883},"sJ8bj","# 停止后台服务\n",[29,886,887,890,893,896,899,902,905,908],{"class":31,"line":56},[29,888,889],{"class":35},"launchctl",[29,891,892],{"class":39}," bootout",[29,894,895],{"class":39}," gui\u002F",[29,897,898],{"class":62},"$(",[29,900,901],{"class":35},"id",[29,903,904],{"class":110}," -u",[29,906,907],{"class":62},")",[29,909,910],{"class":39},"\u002Fcom.user.appstoreagent-guardian\n",[29,912,913],{"class":31,"line":316},[29,914,344],{"emptyLinePlaceholder":343},[29,916,917],{"class":31,"line":322},[29,918,919],{"class":883},"# 清理配置文件\n",[29,921,922,925],{"class":31,"line":328},[29,923,924],{"class":35},"rm",[29,926,927],{"class":39}," ~\u002FLibrary\u002FLaunchAgents\u002Fcom.user.appstoreagent-guardian.plist\n",[929,930,931],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":24,"searchDepth":56,"depth":56,"links":933},[934,935,938,939,940],{"id":12,"depth":56,"text":13},{"id":88,"depth":56,"text":89,"children":936},[937],{"id":164,"depth":316,"text":165},{"id":206,"depth":56,"text":207},{"id":249,"depth":56,"text":250},{"id":666,"depth":56,"text":667,"children":941},[942,943,944],{"id":673,"depth":316,"text":674},{"id":818,"depth":316,"text":819},{"id":869,"depth":316,"text":870},"coder","1. 故障现象 在升级至 macOS Golden Gate 27.0 Developer Beta 2 (B ...","md","\u002Fimages\u002Fposts\u002F2026\u002F07\u002Fblog_cover.jpg",{},"\u002Fzh\u002Fblog\u002Fmacos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop",{"title":5,"description":946},"macos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop","publish","zh\u002Fblog\u002Fmacos-golden-gate-27-0-beta-2-fixing-appstoreagent-at-100-cpu-with-sigstop",[956,957],"beta","macos","y6jVpIsiC2d2Fj6tYpJiSlSraEGL3VafcF1OxLb4GX8",[960,966],{"title":961,"path":962,"stem":963,"slug":964,"date":965,"children":-1},"六个城市，哪张最传神？","\u002Fzh\u002Fblog\u002Fsix-cities-which-one-is-most-vivid","zh\u002Fblog\u002Fsix-cities-which-one-is-most-vivid","six-cities-which-one-is-most-vivid","2026-08-23",{"title":967,"path":968,"stem":969,"slug":970,"date":971,"children":-1},"成都3D微缩图","\u002Fzh\u002Fblog\u002Fchengdu-in-3d-miniature","zh\u002Fblog\u002Fchengdu-in-3d-miniature","chengdu-in-3d-miniature","2025-12-14",1791430075683]