MacOS Sonoma下Launchd脚本访问iCloud驱逐文件遇死锁求助
解决Launchd脚本访问iCloud驱逐文件时的「Resource deadlock avoided」错误
核心解决方案
1. 为Launchd代理启用独立会话
在~/Library/LaunchAgents下的plist配置文件中添加SessionCreate键,让代理运行在完整的用户会话环境中,获得访问iCloud文件的必要权限:
<key>SessionCreate</key> <true/>
修改后重新加载代理:
launchctl unload ~/Library/LaunchAgents/你的代理文件名.plist launchctl load ~/Library/LaunchAgents/你的代理文件名.plist
2. 显式触发iCloud文件下载再操作
Launchd环境无法自动触发iCloud驱逐文件的下载,需用brctl命令主动下载并等待完成:
# 目标文件路径 TARGET_FILE="DSC_0001.jpg" # 检查文件是否被驱逐,是则触发下载 if brctl is-evicted "$TARGET_FILE"; then brctl download "$TARGET_FILE" # 循环等待下载完成 while brctl is-evicted "$TARGET_FILE"; do sleep 1 done fi # 执行后续操作(如rsync备份) rsync -av "$TARGET_FILE" /备份路径/
3. 显式设置环境变量
在plist中添加必要的环境变量,确保脚本能正确定位iCloud路径:
<key>EnvironmentVariables</key> <dict> <key>HOME</key> <string>/Users/你的用户名</string> <key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict>
4. 避免日志文件存放在iCloud目录
如果Launchd代理的StandardOutPath或StandardErrorPath指向iCloud目录,会引发资源竞争导致死锁。建议将日志路径改为本地目录:
<key>StandardOutPath</key> <string>~/Library/Logs/你的脚本名.log</string> <key>StandardErrorPath</key> <string>~/Library/Logs/你的脚本名_error.log</string>
问题原因
终端运行脚本时处于交互式用户会话,系统会自动处理iCloud文件的下载流程(包括必要的权限验证);而Launchd后台代理默认运行在非交互式会话,缺少触发自动下载的上下文,直接访问驱逐文件会导致阻塞,最终抛出「Resource deadlock avoided」错误。通过启用独立会话和显式下载,可模拟终端的运行环境,解决访问阻塞问题。
内容的提问来源于stack exchange,提问作者hansschl
相关产品推荐
相关产品推荐

