如何实现定时任务?unet自动化调度脚本示例
1. 为什么需要定时任务?
你有没有遇到过这些情况:
- 每天早上8点自动处理一批新上传的人像照片,生成卡通风格预览图发到工作群;
- 每隔两小时从指定文件夹扫描新增图片,避免人工反复点击“批量转换”;
- 夜间服务器空闲时自动清理
outputs/目录中超过24小时的临时结果,节省磁盘空间; - 周一至周五上午9点准时推送昨日卡通化处理统计(共处理XX张、平均耗时X秒)。
这些都不是靠手动点击能长期坚持的——人会忘记、会偷懒、会下班。而一台部署好的unet人像卡通化服务,只要配上一个轻量级定时调度脚本,就能变成真正“不知疲倦”的AI小助手。
本文不讲复杂调度系统(如Airflow、Celery),而是用最直接、最易懂、零依赖的方式,教你用Linux原生命令+几行Shell脚本,把科哥构建的这个基于DCT-Net的卡通化工具,变成一台全自动运转的“人像风格化工厂”。
全程无需改一行Python代码,不装新包,不碰WebUI源码,5分钟即可上线。
2. 先搞清:这个服务到底怎么“被调用”?
很多教程失败,是因为没分清“谁在调用谁”。我们先明确三个关键角色:
- WebUI服务本身:运行在
http://localhost:7860的Gradio界面,提供图形操作; - 后端模型服务:实际执行卡通化推理的Python进程(加载了
cv_unet_person-image-cartoon); - 外部调度者:我们要写的定时脚本——它不打开浏览器,也不点按钮,而是模拟用户提交表单的行为。
好消息是:这个WebUI虽是Gradio搭建,但完全开放了API端点。你打开浏览器开发者工具 → Network → 点击“开始转换”,就能看到它向/run/predict发送了一个POST请求,携带了图片base64、参数等数据。
但我们不用这么复杂。更简单、更稳定、更适合定时任务的方式是:直接调用其内置的CLI命令接口。
翻看科哥提供的run.sh脚本和项目结构,你会发现它底层封装了一个可执行的Python入口。我们不需要逆向,只需确认一件事:服务支持命令行批量处理模式。
验证方法很简单,在终端执行:
cd /root/unet-cartoon-app python app.py --help如果输出类似:
usage: app.py [-h] [--input INPUT] [--output OUTPUT] [--resolution RESOLUTION] [--strength STRENGTH] [--format FORMAT]恭喜——你已掌握全自动化的钥匙。
注意:本文所有操作均基于你已完成基础部署(即
/bin/bash /root/run.sh能成功启动WebUI)。若尚未部署,请先完成该步,再继续。
3. 实战:三类高频定时场景脚本详解
我们不写抽象理论,只给能立刻复制粘贴、改两处路径就能跑的脚本。每个脚本都包含:用途说明 + 完整代码 + 使用说明 + 防坑提示。
3.1 场景一:每30分钟扫描并处理新图片(无人值守流水线)
适用于:云服务器挂载NAS相册目录、团队共享文件夹自动美化。
脚本内容(保存为/root/scripts/auto-process.sh)
#!/bin/bash # ================================ # unet人像卡通化 - 自动扫描处理脚本 # 功能:每30分钟检查 input/ 目录,对新图片批量转卡通,结果存 outputs/ # 作者:科哥方案延伸 | 修改于2026年 # ================================ INPUT_DIR="/root/unet-cartoon-app/input" OUTPUT_DIR="/root/unet-cartoon-app/outputs" LOG_FILE="/root/unet-cartoon-app/logs/auto-process.log" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 创建日志和输出目录(若不存在) mkdir -p "$OUTPUT_DIR" "$INPUT_DIR" "$(dirname "$LOG_FILE")" # 获取input目录下所有待处理图片(排除已处理过的) # 我们用文件修改时间 > 上次运行时间 来判断“新” LAST_RUN=$(cat /root/unet-cartoon-app/.last_run_time 2>/dev/null || echo "1970-01-01") find "$INPUT_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.webp" \) -newermt "$LAST_RUN" | while read -r img; do echo "[$TIMESTAMP] 发现新图片:$(basename "$img")" >> "$LOG_FILE" # 构造输出文件名:原名_卡通.png BASENAME=$(basename "$img" | sed 's/\.[^.]*$//') EXT=$(basename "$img" | grep -o '\.[^.]*$' | tr '[:lower:]' '[:upper:]') OUTPUT_NAME="${OUTPUT_DIR}/${BASENAME}_cartoon.png" # 执行转换(使用推荐参数:1024分辨率、强度0.8、PNG无损) if python /root/unet-cartoon-app/app.py \ --input "$img" \ --output "$OUTPUT_NAME" \ --resolution 1024 \ --strength 0.8 \ --format png 2>> "$LOG_FILE"; then echo "[$TIMESTAMP] 成功处理:$(basename "$img") → $(basename "$OUTPUT_NAME")" >> "$LOG_FILE" # 可选:处理完移动原图到 processed/ 目录,避免重复处理 mkdir -p "$INPUT_DIR/processed" mv "$img" "$INPUT_DIR/processed/" else echo "[$TIMESTAMP] ❌ 处理失败:$(basename "$img")" >> "$LOG_FILE" fi done # 更新最后运行时间戳 date '+%Y-%m-%d %H:%M:%S' > /root/unet-cartoon-app/.last_run_time echo "[$TIMESTAMP] 扫描结束,共处理 $(wc -l < "$LOG_FILE" 2>/dev/null || echo 0) 行日志" >> "$LOG_FILE"使用说明:
- 将脚本保存为
/root/scripts/auto-process.sh; - 赋予执行权限:
chmod +x /root/scripts/auto-process.sh; - 手动测试一次:
/root/scripts/auto-process.sh,检查logs/和outputs/是否生成结果; - 设置定时任务(编辑crontab):
# 每30分钟执行一次 */30 * * * * /root/scripts/auto-process.sh
防坑提示:
- 脚本自带防重机制(通过
.last_run_time记录+-newermt筛选),不会重复处理同一张图; - 自动创建缺失目录,避免因路径不存在导致失败;
- ❌ 切勿将
input/目录设为WebUI上传目录(如gradio_cached_examples),否则可能冲突;建议单独建/root/unet-cartoon-app/input作为专用输入通道。
3.2 场景二:每日凌晨2点清理过期输出(磁盘守护者)
适用于:长期运行的服务,防止outputs/目录膨胀占满硬盘。
脚本内容(保存为/root/scripts/clean-outputs.sh)
#!/bin/bash # ================================ # unet人像卡通化 - 自动清理过期输出 # 功能:删除 outputs/ 下超过24小时的文件,保留最近一天结果 # ================================ OUTPUT_DIR="/root/unet-cartoon-app/outputs" LOG_FILE="/root/unet-cartoon-app/logs/clean-outputs.log" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "[$TIMESTAMP] 开始清理 outputs/ 目录..." >> "$LOG_FILE" # 查找并删除24小时前的文件(不删目录) find "$OUTPUT_DIR" -type f -mtime +1 -delete 2>> "$LOG_FILE" # 统计清理结果 COUNT=$(find "$OUTPUT_DIR" -type f -mtime +1 2>/dev/null | wc -l) if [ "$COUNT" -eq 0 ]; then echo "[$TIMESTAMP] 无需清理:所有文件均在24小时内生成" >> "$LOG_FILE" else echo "[$TIMESTAMP] 🧹 已清理 $COUNT 个过期文件" >> "$LOG_FILE" fi # 可选:检查剩余空间,低于10%时发警告(需安装mailutils或替换为微信通知) # df -h "$OUTPUT_DIR" | awk 'NR==2 {if($5+0 > 90) print "警告:磁盘使用率"$5}' >> "$LOG_FILE"使用说明:
- 同样赋予权限:
chmod +x /root/scripts/clean-outputs.sh; - 加入crontab:
# 每天凌晨2点执行 0 2 * * * /root/scripts/clean-outputs.sh
3.3 场景三:每周一上午9点生成处理报告(管理可视化)
适用于:向团队同步AI使用情况,体现自动化价值。
脚本内容(保存为/root/scripts/weekly-report.sh)
#!/bin/bash # ================================ # unet人像卡通化 - 周报生成脚本 # 功能:统计上周 outputs/ 目录生成文件数、总大小、平均处理时长(需配合日志) # 输出为纯文本报告,可邮件/微信发送 # ================================ OUTPUT_DIR="/root/unet-cartoon-app/outputs" LOG_DIR="/root/unet-cartoon-app/logs" REPORT_FILE="/root/unet-cartoon-app/reports/weekly_$(date '+%Y%m%d').txt" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 计算上周一到本周日的时间范围 START_DATE=$(date -d 'last Monday' '+%Y-%m-%d') END_DATE=$(date -d 'next Sunday' '+%Y-%m-%d') echo "=== unet人像卡通化服务周报 ===" > "$REPORT_FILE" echo "统计周期:$START_DATE 至 $END_DATE" >> "$REPORT_FILE" echo "生成时间:$(date)" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # 1. 统计文件数量 COUNT=$(find "$OUTPUT_DIR" -type f -newermt "$START_DATE" ! -newermt "$END_DATE" 2>/dev/null | wc -l) echo " 本周共生成卡通图片:$COUNT 张" >> "$REPORT_FILE" # 2. 统计总大小(MB) SIZE_MB=$(find "$OUTPUT_DIR" -type f -newermt "$START_DATE" ! -newermt "$END_DATE" -exec stat -c "%s" {} \; 2>/dev/null | awk '{sum += $1} END {printf "%.1f", sum/1024/1024}') echo "📦 输出总大小:${SIZE_MB:-0} MB" >> "$REPORT_FILE" # 3. 从日志提取平均处理时长(需日志含耗时信息,如“耗时3.2s”) AVG_TIME=$(grep -oE '耗时[0-9.]+s' "$LOG_DIR/auto-process.log" 2>/dev/null | grep -oE '[0-9.]+' | awk '{sum += $1; count++} END {if(count>0) printf "%.1f", sum/count}' || echo "N/A") echo "⏱ 平均单图处理耗时:${AVG_TIME}s" >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" echo " 提示:本报告由自动化脚本生成,无需人工干预。" >> "$REPORT_FILE" # 可选:发送到邮箱(取消下面两行注释,并配置mail) # SUBJECT="【AI周报】unet卡通化服务 $START_DATE-$END_DATE" # mail -s "$SUBJECT" your@email.com < "$REPORT_FILE"使用说明:
- 加入crontab:
# 每周一上午9点执行 0 9 * * 1 /root/scripts/weekly-report.sh
4. 进阶技巧:让定时任务更可靠、更聪明
上面三个脚本已覆盖90%日常需求。但真实生产环境还需一点“小心机”:
4.1 服务健康检查:定时任务前先确认WebUI活着
在每个脚本开头加入:
# 检查WebUI是否响应(端口7860) if ! timeout 5 bash -c ":</dev/tcp/127.0.0.1/7860" 2>/dev/null; then echo "[$(date)] ❌ WebUI未运行,尝试重启..." >> "$LOG_FILE" /bin/bash /root/run.sh 2>&1 >> "$LOG_FILE" & sleep 15 # 等待启动 fi4.2 错误自动重试:网络抖动或显存不足时多试两次
将核心命令包裹为:
for i in {1..3}; do if python app.py --input "$img" --output "$out" --resolution 1024; then break elif [ $i -eq 3 ]; then echo "❌ 重试3次仍失败:$(basename "$img")" >> "$LOG_FILE" else echo " 第$i次失败,3秒后重试..." >> "$LOG_FILE" sleep 3 fi done4.3 日志轮转:避免单个log文件无限增长
用logrotate或简单加一行:
# 在脚本末尾添加(按月分割日志) if [ $(date '+%d') -eq 01 ]; then mv "$LOG_FILE" "${LOG_FILE}_$(date -d 'last month' '+%Y%m')_bak" fi5. 总结:定时不是目的,自动化才是常态
你现在已经掌握了:
- 如何绕过WebUI,直连unet卡通化服务的命令行接口;
- 三个开箱即用的定时脚本:自动处理、自动清理、自动报告;
- 三条防坑经验:防重复、防中断、防磁盘爆满;
- 三项进阶能力:服务自检、失败重试、日志管理。
这些脚本加起来不到200行,却能让科哥构建的这个强大工具,真正从“演示项目”蜕变为“生产级AI服务”。
记住:最好的自动化,是让你彻底忘记它的存在。
当某天你发现,相册里新照片自动变卡通、日报准时出现在钉钉、磁盘空间永远充裕——你就知道,这台服务器,已经学会自己工作了。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。