Mac端闲置时关闭Adobe后台进程的AppleScript脚本问题咨询
Adobe后台驻留进程清理脚本问题解答
背景
本问题及对应代码衍生自StackOverflow上perfectfiasco的提问与Ted Wrigley给出的回答。
场景说明:在禁用访达扩展、且未运行任何Adobe应用的前提下,后台仍有大量Adobe相关进程驻留占用资源。提问者在原有实现基础上新增对Lightroom、Creative Cloud、Adobe Bridge三款应用的适配,同时修改代码纳入所有Adobe后台运行的进程,针对实现过程中遇到的疑问解答如下:
问题解答
1. 新增的进程配置是否正确?
当前新增的应用名称匹配逻辑基本可用,但存在两处可优化点:
- 不同版本的Adobe应用本地化名称存在差异,比如Lightroom Classic部分大版本会携带年份后缀,Creative Cloud的本地化名称也可能随地区和安装包版本出现细微区别,可先在「活动监视器」中确认本机安装的对应应用准确本地化名称后,再调整匹配规则
- 若有其他常用Adobe应用(如Illustrator、Premiere Pro等)的清理需求,可按需补充到判断条件中
2. 应用与进程的区分逻辑,针对应用是否需要使用killall指令,还是仅调用quit指令即可?
quit是向进程发送正常退出信号,进程会完成当前未执行完的操作(如同步缓存、保存配置)后再退出,属于安全操作,优先推荐使用killall是强制终止进程,无论进程当前是否正在运行任务,都会直接销毁进程资源,仅当quit指令执行失败、进程无响应时再使用
区分逻辑:所有GUI应用和可接受高级事件的后台进程,都先调用quit指令,无响应进程再用killall强制终止
3. 以此类方式强制退出进程和应用是否存在风险?
存在两类潜在风险:
- 若退出进程时仍有Adobe应用在后台运行未被检测到,强制终止后台进程可能导致正在运行的应用崩溃,未保存的工作内容丢失
- 强制终止Core Sync这类同步进程时,若正处于云文件同步状态,可能出现同步文件损坏、云文件与本地文件版本不一致的问题
建议在执行退出逻辑前增加一层判断,确认所有Adobe前台应用都完全退出后,再执行后台进程的退出操作
4. 大量Adobe进程退出后会启动AdobeCRDaemon守护进程,是否属于预期行为?
属于正常预期行为。AdobeCRDaemon是Adobe的版权验证和许可证守护进程,只要检测到相关Adobe进程被终止,且许可证处于有效期内,系统就会自动拉起该进程做许可证状态校验。如果需要终止该进程,将其添加到退出进程列表即可
5. 新增多个进程后,tell process "AGMService"部分该如何调整?
当前代码逻辑存在缺陷:所有进程的退出逻辑都嵌套在tell process "AGMService"块内,若AGMService进程不存在,后续所有其他进程的退出逻辑都不会执行。
调整方案:将每个进程的判断逻辑独立出来,不要嵌套在AGMService的tell块中。可以先整理所有要退出的Adobe后台进程列表,对每个进程单独判断是否存在、是否接受高级事件,再执行对应的quit或者killall操作
6. 现有代码针对macOS Monterey系统还需做哪些适配更新?
需要做3项适配调整:
- Monterey对AppleScript的权限管控更严格,需要在「系统偏好设置-安全性与隐私-隐私-辅助功能」中给该脚本应用开放权限,同时开启「完全磁盘访问权限」,否则会出现无法调用System Events、无法执行killall指令的问题
- Monterey中部分Adobe进程的名称有小幅调整,比如Creative Cloud Helper部分版本会命名为
Creative Cloud (Helper),建议在活动监视器中核对后调整匹配名称 - 可将NSWorkspace的通知监听逻辑调整为仅过滤监听Adobe应用的退出通知,减少不必要的触发,降低资源占用
附完整原始代码
use AppleScript version "2.4" use framework "AppKit" use scripting additions property NSWorkspace : class "NSWorkspace" on run set workSp to NSWorkspace's sharedWorkspace() set notifCent to workSp's notificationCenter() tell notifCent to addObserver:me selector:"someAppHasTerminated:" |name|:"NSWorkspaceDidTerminateApplicationNotification" object:(missing value) end run on idle -- we don't use the idle loop, so tell the system let the app sleep. this comes out of idle once an hour return 3600 end idle on someAppHasTerminated:notif set termedApp to (notif's userInfo's valueForKey:"NSWorkspaceApplicationKey") set termedAppName to (termedApp's localizedName) as text -- I'm guessing at the localized names for Photoshop and Illustrator. you may need to alter these if termedAppName is "Adobe Photoshop 2022" or termedAppName is "Adobe Lightroom Classic" or termedAppName is "Adobe Bridge 2022" or termedAppName is "Adobe Lightroom" or termedAppName is "Creative Cloud" then -- close the service here tell application "System Events" tell process "AGMService" if its accepts high level events is true then tell application "AGMService" to quit tell application "Adobe Desktop Service" to quit tell application "CCLibrary" to quit tell application "CCXProcess" to quit tell application "Core Sync" to quit tell application "Creative Cloud Helper" to quit else do shell script "killall AGMService" do shell script "killall Adobe Desktop Service" do shell script "killall CCLibrary" do shell script "killall CCXProcess" do shell script "killall Core Sync" do shell script "killall Creative Cloud Helper" end if end tell end tell end if end someAppHasTerminated:
内容的提问来源于stack exchange,提问作者Outer
相关产品推荐
相关产品推荐

