Open-AutoGLM结合cron实现定时自动化

1. 为什么需要定时自动化?

你有没有想过,让AI在每天固定时间自动帮你做些事?比如早上8点打开新闻App浏览头条、每小时检查一次商品价格、深夜自动清理缓存、或者定时给重要联系人发送问候消息?Open-AutoGLM本身已经能用自然语言操控手机,但它的真正潜力,只有和系统级定时任务结合后才完全释放。

这不是简单的“脚本+计划任务”拼凑,而是把AI的意图理解能力、多模态感知能力和自动化执行能力,嵌入到操作系统的时间脉搏里。本文不讲理论,只聚焦一件事:如何用最稳定、最易维护的方式,让Open-AutoGLM真正成为你手机的“24小时值班助理”

我们跳过所有冗余概念,直接从实际部署开始——目标明确:今天下午就能跑通第一个定时任务

2. 环境准备:确保基础链路畅通

在谈定时之前,必须确认你的Open-AutoGLM控制端已能稳定运行。如果还没完成基础部署,请先确保以下三件事全部验证通过:

2.1 设备连接状态可持久化

ADB连接不能是“临时性”的。很多用户踩坑在于:本地终端开着时一切正常,一旦关闭终端或重启电脑,定时任务就失败。根本原因是ADB服务未设为开机自启,或设备授权未固化。

验证方法

adb devices

输出应为类似:

List of devices attached
0123456789ABCDEF    device

若显示 unauthorized 或空白,请立即处理

  • 在手机上弹出的“允许USB调试”对话框中勾选“始终允许”,再点击确定
  • 执行 adb kill-server && adb start-server 重置服务
  • 关键一步:将ADB服务设为系统级守护进程(Linux/macOS):
    # 创建systemd服务(Linux)
    sudo tee /etc/systemd/system/adb-server.service << 'EOF'
    [Unit]
    Description=ADB Server Service
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/adb start-server
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl enable adb-server.service
    sudo systemctl start adb-server.service
    

2.2 模型服务地址必须可长期访问

无论是调用云端API还是本地vLLM服务,其URL必须在定时任务触发时100%可达

  • 云端方案:确认API Key未过期,配额充足,网络出口无防火墙拦截
  • 本地vLLM方案:确保服务以--host 0.0.0.0启动(而非默认的127.0.0.1),否则cron环境无法访问:
    python3 -m vllm.entrypoints.openai.api_server \
      --host 0.0.0.0 \
      --port 8000 \
      --served-model-name autoglm-phone-9b \
      --model zai-org/AutoGLM-Phone-9B \
      --max-model-len 25480 \
      --chat-template-content-format string \
      --limit-mm-per-prompt "{\"image\":10}"
    
  • 验证命令(在任意新终端中执行):
    curl -s http://localhost:8000/v1/models | jq '.data[0].id' 2>/dev/null | grep -q "autoglm-phone-9b" && echo " 模型服务就绪" || echo "❌ 服务不可达"
    

2.3 Python环境必须独立且完整

定时任务运行在系统级shell中,与你日常开发的虚拟环境完全隔离。直接pip install到全局环境会引发权限和依赖冲突。

正确做法:使用绝对路径调用虚拟环境中的Python解释器
假设你的Open-AutoGLM项目位于/home/user/Open-AutoGLM,且已创建虚拟环境venv

# 验证路径有效性
ls /home/user/Open-AutoGLM/venv/bin/python
# 应输出:/home/user/Open-AutoGLM/venv/bin/python

注意:Windows用户请跳过本节,直接使用任务计划程序(后续章节详述),因Windows的cron等效工具(如schtasks)对环境变量管理更复杂,需单独配置。

3. 核心实现:cron定时任务的三重加固

Linux/macOS的cron看似简单,实则暗藏三大陷阱:环境变量丢失、工作目录错乱、输出日志不可见。我们将逐层加固,确保每次执行都像手动操作一样可靠。

3.1 创建可复用的任务脚本

不要在crontab中直接写长命令!创建一个独立的shell脚本,集中处理所有上下文问题。

新建文件 /home/user/Open-AutoGLM/run_daily_news.sh

#!/bin/bash
# 设置绝对路径,避免依赖当前目录
PROJECT_DIR="/home/user/Open-AutoGLM"
VENV_PYTHON="$PROJECT_DIR/venv/bin/python"
ADB_CMD="/usr/bin/adb"

# 强制设置环境变量(关键!)
export PATH="/usr/local/bin:/usr/bin:/bin"
export PYTHONIOENCODING=utf-8

# 切换到项目目录(防止main.py找不到模块)
cd "$PROJECT_DIR" || exit 1

# 检查ADB设备是否在线(避免任务失败)
if ! $ADB_CMD devices | grep -q "device"; then
    echo "$(date): ADB设备未连接,跳过本次任务" >> /var/log/open-autoglm-cron.log
    exit 0
fi

# 执行核心任务(添加超时保护,防卡死)
timeout 120 $VENV_PYTHON main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "http://localhost:8000/v1" \
  --model "autoglm-phone-9b" \
  "打开今日头条,浏览科技频道前5条新闻,并截图保存" \
  2>&1 >> /var/log/open-autoglm-cron.log

# 记录执行结果
echo "$(date): 任务执行完毕,退出码 $?" >> /var/log/open-autoglm-cron.log

赋予执行权限

chmod +x /home/user/Open-AutoGLM/run_daily_news.sh

脚本设计要点解析

  • 使用绝对路径:杜绝cdpwd导致的路径错误
  • 显式设置PATHPYTHONIOENCODING:解决cron默认环境缺失问题
  • ADB连通性预检:避免设备断开时浪费资源
  • timeout 120:强制120秒超时,防止AI卡在某个界面无限等待
  • 日志统一追加到/var/log/:便于系统级日志轮转管理

3.2 编写健壮的crontab规则

不要用 crontab -e 直接编辑! 使用独立的crontab文件,便于版本管理和故障回滚。

创建 /home/user/Open-AutoGLM/crontab.conf

# 每天早上8:00执行新闻浏览任务
0 8 * * * /home/user/Open-AutoGLM/run_daily_news.sh

# 每30分钟检查一次设备连接状态(保持ADB活跃)
*/30 * * * * /usr/bin/adb devices >/dev/null 2>&1

# 每周日凌晨2:00清理日志(保留最近7天)
0 2 * * 0 find /var/log -name "open-autoglm-cron.log*" -mtime +7 -delete

加载规则

# 将规则导入当前用户crontab
crontab /home/user/Open-AutoGLM/crontab.conf

# 验证是否生效
crontab -l | grep "open-autoglm"

关键安全机制

  • */30 * * * * 的ADB保活任务:防止长时间无操作导致设备休眠断连
  • 日志清理规则:避免磁盘被日志占满(生产环境必备)

3.3 构建日志监控闭环

没有日志监控的定时任务等于“黑盒”。我们建立三层反馈机制:

第一层:基础日志(已内置)
/var/log/open-autoglm-cron.log 记录每次执行的原始输出,包括AI返回的JSON结果。

第二层:结构化状态日志
修改run_daily_news.sh,在末尾添加状态标记:

# 在脚本末尾追加
if [ $? -eq 0 ]; then
    echo "$(date): SUCCESS" >> /var/log/open-autoglm-status.log
else
    echo "$(date): FAILED" >> /var/log/open-autoglm-status.log
fi

第三层:异常告警(可选但强烈推荐)
当连续3次失败时,自动发邮件通知(需配置mailutils):

# 添加到crontab.conf末尾
# 每5分钟检查一次失败状态
*/5 * * * * /home/user/Open-AutoGLM/check_failure.sh

check_failure.sh内容

#!/bin/bash
FAIL_COUNT=$(grep -c "FAILED" /var/log/open-autoglm-status.log | tail -n1)
if [ "$FAIL_COUNT" -ge 3 ]; then
    echo "Open-AutoGLM定时任务连续失败3次,请立即检查!" | mail -s "🚨 Open-AutoGLM告警" admin@yourdomain.com
    # 重置计数器(避免重复告警)
    sed -i '/FAILED/d' /var/log/open-autoglm-status.log
fi

4. 实战场景:5个即装即用的自动化模板

所有模板均基于真实测试,可直接复制使用。只需替换设备ID、模型地址和指令文本。

4.1 每日健康打卡(医疗类App)

适用场景:医院官方App每日体温上报、运动步数同步
脚本内容(保存为run_health_check.sh):

#!/bin/bash
PROJECT_DIR="/home/user/Open-AutoGLM"
cd "$PROJECT_DIR" || exit 1
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "https://open.bigmodel.cn/api/paas/v4" \
  --model "autoglm-phone" \
  --apikey "YOUR_API_KEY" \
  "打开浙里办App,进入健康码页面,点击‘每日健康打卡’,填写今日体温36.5度,提交"

Cron规则

# 每天上午9:30执行
30 9 * * * /home/user/Open-AutoGLM/run_health_check.sh

4.2 商品价格监控(电商类App)

适用场景:监控京东/淘宝某商品降价,降价后自动截图并保存
脚本内容monitor_price.sh):

#!/bin/bash
PROJECT_DIR="/home/user/Open-AutoGLM"
cd "$PROJECT_DIR" || exit 1
# 使用--output-dir参数指定截图保存路径
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "http://localhost:8000/v1" \
  --model "autoglm-phone-9b" \
  --output-dir "/home/user/price_snapshots/$(date +%Y%m%d)" \
  "打开京东App,搜索商品ID:100012345678,截图当前价格区域"

Cron规则(每2小时检查一次):

0 */2 * * * /home/user/Open-AutoGLM/monitor_price.sh

4.3 社交平台定时发布(内容运营)

适用场景:小红书/微博每日早8点发布固定文案
脚本内容post_daily_content.sh):

#!/bin/bash
PROJECT_DIR="/home/user/Open-AutoGLM"
cd "$PROJECT_DIR" || exit 1
# 从文件读取动态文案(支持每日更换)
CONTENT=$(cat /home/user/daily_content.txt)
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "https://api-inference.modelscope.cn/v1" \
  --model "ZhipuAI/AutoGLM-Phone-9B" \
  --apikey "YOUR_MODELSCOPE_KEY" \
  "打开小红书App,点击底部+号,选择‘图文’,输入标题:${CONTENT},添加标签#AI自动化,发布"

Cron规则

# 每天8:00执行
0 8 * * * /home/user/Open-AutoGLM/post_daily_content.sh

4.4 App性能巡检(开发者专用)

适用场景:每日凌晨自动测试App冷启动时间、关键页面加载速度
脚本内容app_benchmark.sh):

#!/bin/bash
PROJECT_DIR="/home/user/Open-AutoGLM"
cd "$PROJECT_DIR" || exit 1
# 启动时记录时间戳,AI执行后自动计算耗时
START_TIME=$(date +%s)
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "http://localhost:8000/v1" \
  --model "autoglm-phone-9b" \
  "打开测试App,点击首页按钮,等待‘加载完成’提示出现,截图并返回桌面"
END_TIME=$(date +%s)
ELAPSED=$((END_TIME - START_TIME))
echo "$(date): 冷启动耗时 ${ELAPSED}秒" >> /var/log/app_benchmark.log

Cron规则

# 每日凌晨3:00执行
0 3 * * * /home/user/Open-AutoGLM/app_benchmark.sh

4.5 多设备协同任务(高级玩法)

适用场景:一台电脑同时控制多台测试机,执行不同任务
脚本内容multi_device.sh):

#!/bin/bash
# 设备1:测试机A(ID: device_a)
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "device_a" \
  --base-url "http://localhost:8000/v1" \
  --model "autoglm-phone-9b" \
  "打开微信,向测试群发送‘设备A巡检开始’"

# 设备2:测试机B(ID: device_b)
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "device_b" \
  --base-url "http://localhost:8000/v1" \
  --model "autoglm-phone-9b" \
  "打开钉钉,查看今日待办事项并截图"

# 设备3:真机(ID: 0123456789ABCDEF)
/home/user/Open-AutoGLM/venv/bin/python main.py \
  --device-id "0123456789ABCDEF" \
  --base-url "https://open.bigmodel.cn/api/paas/v4" \
  --model "autoglm-phone" \
  --apikey "YOUR_KEY" \
  "打开支付宝,查询余额并截图"

Cron规则

# 每天上午10:00执行
0 10 * * * /home/user/Open-AutoGLM/multi_device.sh

5. 故障排查:定时任务失效的7个高频原因

即使按上述步骤操作,仍可能遇到任务静默失败。以下是生产环境验证过的排查清单:

5.1 ADB设备ID动态变化

现象adb devices 显示ID,但cron执行时提示设备不存在
根因:USB设备重连后ID变更(尤其使用USB集线器时)
解决方案:改用设备序列号(Serial Number)替代ID

# 获取稳定序列号
adb get-serialno  # 输出:ZY223456789
# 在脚本中使用
--device-id "ZY223456789"

5.2 cron环境缺少DISPLAY变量(GUI应用)

现象:任务涉及需要图形界面的操作(如某些App的WebView)时失败
解决方案:在脚本开头添加

export DISPLAY=:0
export XAUTHORITY=/home/user/.Xauthority

5.3 Python路径在cron中解析错误

现象ModuleNotFoundError: No module named 'phone_agent'
解决方案:在脚本中显式添加Python路径

export PYTHONPATH="/home/user/Open-AutoGLM:$PYTHONPATH"

5.4 中文指令编码问题

现象:AI收到乱码指令,返回“无法理解”
解决方案:在脚本中强制UTF-8

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

5.5 vLLM服务内存溢出

现象:定时任务执行到一半,vLLM进程崩溃
解决方案:限制vLLM内存使用(启动时添加)

--gpu-memory-utilization 0.85  # 仅使用85%显存

5.6 手机休眠导致ADB断连

现象:夜间任务失败,日志显示“device offline”
解决方案:在脚本中添加唤醒命令

adb shell input keyevent KEYCODE_WAKEUP  # 唤醒屏幕
adb shell input keyevent KEYCODE_MENU     # 解锁(需提前设置无密码锁屏)

5.7 指令超时未处理敏感场景

现象:遇到登录页或验证码时,任务卡住直至超时
解决方案:在指令末尾添加接管提示

"打开银行App,进入转账页面,如遇登录或验证码,请暂停并等待人工接管"

6. 进阶优化:让自动化更智能、更省心

6.1 动态指令生成

不局限于固定文本,让AI根据实时数据生成指令。例如:

  • 读取天气API,生成“根据今日气温,推荐合适穿搭”指令
  • 解析股票行情,生成“查看贵州茅台今日K线图”指令

示例脚本片段

import requests
weather = requests.get("http://wttr.in/Shanghai?format=%C+%t").text.strip()
instruction = f"打开小红书,搜索‘{weather}穿搭指南’"
# 将instruction传给PhoneAgent.run()

6.2 失败自动重试机制

run_daily_news.sh中添加重试逻辑:

for i in {1..3}; do
    timeout 120 $VENV_PYTHON main.py ... && break || sleep 30
done

6.3 跨平台兼容方案(Windows用户)

Windows用户请使用任务计划程序替代cron:

  1. 创建批处理文件 run_task.bat(内容同Linux脚本,但用.bat语法)
  2. 在任务计划程序中新建任务 → 触发器设为“按预定计划” → 操作设为“启动程序” → 程序路径填cmd.exe,参数填/c "D:\Open-AutoGLM\run_task.bat"
  3. 在“常规”选项卡中勾选“不管用户是否登录都要运行”和“不存储密码则只在用户登录时运行”

总结

Open-AutoGLM与cron的结合,不是简单的功能叠加,而是将AI的“认知能力”注入到操作系统的“时间维度”中。本文提供的方案经过生产环境验证,具备三个核心特性:

  • 稳定性:通过ADB保活、超时控制、日志监控构建三层防护
  • 可维护性:所有配置分离为独立文件(脚本、crontab、日志),支持Git版本管理
  • 可扩展性:模板化设计支持快速新增任务,多设备脚本证明横向扩展能力

真正的自动化价值,不在于它能执行多少任务,而在于它能否在无人值守时持续创造价值。当你设置好第一个定时任务,看着手机在清晨8点自动打开新闻App并开始浏览,那一刻,你拥有的不再是一个工具,而是一个真正理解你需求的数字同事。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐