对于程序员来说就要会偷懒,不要被各种重复的任务消耗精力。任务自动化就是不错的方式,不管是备份文件、定时发送邮件报表,还是从摄像头抓取画面,自动化都能帮我们节省实践、减少失误,只需要几行代码和合适的调度工具,就能搭建出一套稳定运行的自动化系统。今天我们就以一个需求,让电脑每小时从网络摄像头自动抓取一张快照并保存,让我们来看一看两种方案的差别:大致流程就是通过摄像头的RTSP地址建立连接;抓取一帧画面;按时间戳命名保存图片;每小时自动执行一次。Cron是Linux和MacOS系统内置的任务调度工具,相当于给电脑设置的定时闹钟,能在指定的时间自动执行命令或脚本。Cron的执行规则由一行时间表达式定义,语法格式如下:┌───────────── 分钟 (0–59)│ ┌──────────── 小时 (0–23)│ │ ┌──────────── 日期 (1–31)│ │ │ ┌──────────── 月份 (1–12)│ │ │ │ ┌──────────── 星期 (0–6,0代表周日)│ │ │ │ │* * * * * 要执行的命令
我们只需要把时间规则和要运行的脚本结合,就能创建定时任务。接下来我们编写python脚本,它只做一件事,连接摄像头、抓图、保存import cv2import osfrom datetime import datetime# 摄像头的 RTSP 链接(替换为你的设备地址)rtsp_url = "rtsp://username:password@192.168.1.65:554/stream"# 图片保存目录(不存在则自动创建)folder = "hourly_photos"os.makedirs(folder, exist_ok=True)# 连接摄像头并读取一帧画面cap = cv2.VideoCapture(rtsp_url)success, frame = cap.read()cap.release() # 立即关闭摄像头连接# 保存图片if success: filename = f"{folder}/photo_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" cv2.imwrite(filename, frame) print("照片保存成功:", filename)else: print("摄像头画面抓取失败")
0 * * * * /usr/bin/python3 /home/<你的用户名>/<脚本文件名>.py >> /home/你的用户名/photo_log.txt 2>&1
配置好后,系统会每小时执行一次脚本,无需要人工干预。Cron的方案优势,架构简单、稳定性强大、轻量无负担、测试便捷。第二种方式就是Python脚本内调度库Schedule,它的核心逻辑是让脚本长期在后台运行,在脚本内部定义任务执行规则。import scheduleimport timeimport cv2from datetime import datetimedef take_photo(): """抓取摄像头画面并保存""" cap = cv2.VideoCapture("rtsp://你的摄像头地址") success, frame = cap.read() cap.release() if success: filename = f"photo_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" cv2.imwrite(filename, frame)# 定义调度规则:每小时执行一次 take_photo 函数schedule.every().hour.do(take_photo)# 让脚本持续运行,轮询任务队列while True: schedule.run_pending() time.sleep(60) # 每分钟检查一次任务是否需要执行
schedule的方案,必须长期执行,一旦电脑重启,脚本崩溃,任务就会中断,要保证稳定性,还需要配置守护进程工具;它还会持续占用资源,即便是任务处于等待状态,脚本也会占用一定的内存和CPU;调试难度高,资源浪费。当每小时、每天执行低频任务时,选择Cron;每分钟执行多次高频任务时选schedule;任务逻辑简单,不依赖历史执行数据时选择Cron;如果你嫌麻烦,追求配置完就不管的省心,那就选cron。