Raspberry Pi定时拍摄脚本故障:多次捕获后无法获取相机
Raspberry Pi Zero延时拍摄脚本相机占用问题解决
问题概述
使用Raspberry Pi Zero搭配官方ZeroCam实现延时拍摄,通过crontab配置每日6:00-20:59每分钟运行一次拍摄脚本,但频繁出现仅成功拍摄几张后停止的情况。设置每日5:55自动重启后,今早仅拍摄20张就失效。故障触发后手动执行脚本,libcamera提示failed to acquire camera,重启设备可临时恢复正常。
现有配置与输出
拍摄脚本(capture.sh)
#!/bin/sh SPACE=$(df / -m | awk '/[0-9]%/{print $(NF-2)}') if [ "$SPACE" -gt "1024" ] then DATE=$(date +"%Y-%m-%d_%H:%M:%S") libcamera-jpeg -n -o /home/apbarratt/captures/$DATE.jpg else echo "Disk space too low." fi
Crontab配置(sudo crontab -e编辑)
* 6-20 * * * sh /home/apbarratt/capture.sh 2>&1 55 5 * * * root reboot
故障时脚本输出
./capture.sh [11:01:20.747212098] [5076] INFO Camera camera_manager.cpp:299 libcamera v0.0.4+22-923f5d70 [11:01:20.908320544] [5077] INFO RPI raspberrypi.cpp:1476 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0 [11:01:20.910700063] [5076] INFO Camera camera.cpp:841 Pipeline handler in use by another process ERROR: *** failed to acquire camera /base/soc/i2c0mux/i2c@1/ov5647@36 ***
正常运行时输出
./capture.sh [0:01:10.299957000] [771] INFO Camera camera_manager.cpp:299 libcamera v0.0.4+22-923f5d70 [0:01:10.457443000] [772] INFO RPI raspberrypi.cpp:1476 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0 [0:01:10.462446000] [771] INFO Camera camera.cpp:1028 configuring streams: (0) 1296x972-YUV420 [0:01:10.465075000] [772] INFO RPI raspberrypi.cpp:851 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 1296x972-SGBRG10_1X10 - Selected unicam format: 1296x972-pGAA [0:01:15.638456000] [771] INFO Camera camera.cpp:1028 configuring streams: (0) 2592x1944-YUV420 (1) 2592x1944-SGBRG10_CSI2P [0:01:15.645574000] [772] INFO RPI raspberrypi.cpp:851 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 2592x1944-SGBRG10_1X10 - Selected unicam format: 2592x1944-pGAA Still capture image received
问题根源与解决步骤
1. 核心原因
Raspberry Pi Zero性能有限,libcamera-jpeg拍摄+保存图片的耗时可能接近或超过1分钟,crontab每分钟启动新脚本导致多个进程并行抢占相机资源;部分进程异常退出后未释放硬件资源,最终触发相机占用错误。
2. 优化拍摄脚本
修改capture.sh,添加锁文件防止并行执行,同时清理残留进程、增加超时机制:
#!/bin/sh # 定义锁文件,避免并行执行 LOCK_FILE="/tmp/capture_lock" if [ -f "$LOCK_FILE" ]; then echo "$(date +"%Y-%m-%d_%H:%M:%S"): Capture process already running" >> /var/log/capture.log exit 1 fi touch "$LOCK_FILE" # 清理残留的libcamera进程 pkill -f "libcamera-jpeg" # 检查磁盘空间 SPACE=$(df / -m | awk '/[0-9]%/{print $(NF-2)}') DATE=$(date +"%Y-%m-%d_%H:%M:%S") if [ "$SPACE" -gt "1024" ] then # 10秒超时确保进程能退出,可根据实际调整 timeout 10 libcamera-jpeg -n -o /home/apbarratt/captures/$DATE.jpg if [ $? -ne 0 ]; then echo "$DATE: Capture failed" >> /var/log/capture.log fi else echo "$DATE: Disk space too low" >> /var/log/capture.log fi # 删除锁文件 rm -f "$LOCK_FILE"
3. 调整Crontab配置
- 给脚本添加执行权限:
chmod +x /home/apbarratt/capture.sh
- 修改crontab(
sudo crontab -e),直接调用脚本并输出日志到文件:
* 6-20 * * * /home/apbarratt/capture.sh >> /var/log/capture.log 2>&1 55 5 * * * reboot
注意:sudo crontab中无需添加root前缀,直接写reboot即可。
4. 额外优化建议
- 降低拍摄分辨率:用
--width和--height参数减少处理压力,例如libcamera-jpeg -n --width 1296 --height 972 -o ... - 检查电源供应:确保使用5V/2A以上的官方电源适配器,避免供电不足导致相机异常
- 监控日志:定期查看
/var/log/capture.log排查执行异常
内容的提问来源于stack exchange,提问作者apbarratt
相关产品推荐
相关产品推荐

