You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置

  1. 给脚本添加执行权限:
chmod +x /home/apbarratt/capture.sh
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:55:42