概述:
您好。我有一个python程序,在9-5小时之间控制一个运动传感器。该程序在树莓派上运行,存储在带有西方人v2.1 Debian OS的SD媒体上。该计划在很大程度上依赖于time.sleep方法在非工作时间睡觉,并在第二天上午9点恢复它的职责。如果传感器触发,它会通过网络摄像头自动拍摄一张小图片。
问题:
直到最近该程序运行正常,直到某天有人触发传感器并且take_picture()函数无法初始化/ dev / video0。似乎udev没有将设备映射到/ dev / video *,当我重新插入网络摄像头并用“ dmesg | tail ”检查它的状态时,我收到一个错误:< / p>
[36725.201116] EXT4-fs error (device mmcblk0p2): udev
在研究问题并得出文件系统损坏的结论后,我试图在SD媒体上运行文件系统检查。在该过程中解决了许多错误,但重新安装USB网络摄像头后再次出现相同的EXT4-fs错误消息。
修复尝试#1
此时我重新安装了操作系统并重新运行了我的传感器python程序;两天它工作,发送图像,睡觉。我假设一切正常,所以我关闭设备将传感器放在更集中的位置。
启动设备并只是从ssh连接运行“python”命令后,我收到此错误:
Traceback (most recent call last):
File "/usr/lib/python2.7/site.py", line 562, in <module>
main()
File "/usr/lib/python2.7/site.py", line 544, in main
known_paths = addusersitepackages(known_paths)
File "/usr/lib/python2.7/site.py", line 271, in addusersitepackages
user_site = getusersitepackages()
File "/usr/lib/python2.7/site.py", line 246, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/usr/lib/python2.7/site.py", line 235, in getuserbase
from sysconfig import get_config_var
ImportError: cannot import name get_config_var
在程序运行的时间和重新启动之间没有更改任何设置。我假设最坏的情况并再次检查“dmesg | tail”并收到更多文件系统错误:
[36725.201116] EXT4-fs error (device mmcblk0p2): ext4_ext_check_inode:403: inode #21266: comm python: bad header/extent: invalid extent entries - magic f30a, entries 1, max 4(4), depth 0(0)
[36725.239030] EXT4-fs error (device mmcblk0p2): ext4_ext_check_inode:403: inode #21427: comm python: bad header/extent: too large eh_max - magic f30a, entries 1, max 516(4), depth 0(0)
经过额外的文件系统检查并重启后,运行“python”:
[ 819.427780] EXT4-fs error (device mmcblk0p2): ext4_ext_check_inode:403: inode #21266: comm python: bad header/extent: invalid extent entries - magic f30a, entries 1, max 4(4), depth 0(0)
[ 819.470874] EXT4-fs error (device mmcblk0p2): ext4_ext_check_inode:403: inode #21427: comm python: bad header/extent: too large eh_max - magic f30a, entries 1, max 516(4), depth 0(0)
[ 819.570893] EXT4-fs error (device mmcblk0p2): ext4_xattr_block_get:232: inode #21265: comm python: bad block 128
此时我认为这些错误的原因可能与我的程序的核心有关,但实质上它非常简单,只在创建图片时写入磁盘。以下是罪魁祸首代码:
潜在问题的代码:
def take_picture():
cam = pygame.camera.Camera("/dev/video0",(320,240)) #1280x960 max but slow
pygame.init()
cam.start()
print "Capturing Image..."
image_output = cam.get_image()
pygame.image.save(image_output,'img_' +str(get_timestamp)+'.jpg')
cam.stop()
#activate PIR
def pir_init():
while True:
m = datetime.datetime.now().time().minute #loop through for current time
h = datetime.datetime.now().time().hour
d = datetime.datetime.today().weekday()
if d > 4:
print("Sleeping...")
print time_sleep
time_sleep = (((7 - d) * 3600) * 24) - (h * 3600) + (9 * 3600)
time.sleep(time_sleep)
elif h < 9:
print("Sleeping...")
time_sleep = (9 - h) * 3600
time.sleep(time_sleep)
elif h > 16:
print("Sleeping...")
time_sleep = ((24 - h) + 9) * 3600
time.sleep(time_sleep)
elif io.input(pir_pin):
print("PIR ALARM")
pygame.camera.init()
time.sleep(1.5)
take_picture()
send_gmail()
time.sleep(10) #cooldown to prevent email spew
else:
print "Waiting..."
time.sleep(0.5) #sleep and wait for movement
print m
print "Wait"
我上面可以看到的唯一潜在问题可能是生成图片或长时间睡眠。
任何了解可能导致这些重复文件系统错误的内容都将受到赞赏。提前谢谢!
答案 0 :(得分:5)
SD卡在Raspberry Pi上损坏是很常见的,而且这段代码无法直接导致这种情况。
我认为代码会导致我看到的问题的唯一原因是它是否经常尝试写入SD卡,这不太可能并且很可能是由潜在问题引起的。也许SD卡坏了,或来自坏的批次。
如果您只是将这些图片作为电子邮件发送,则可能是根本不将图片存储在硬盘上的替代方法。或者您可以添加USB硬盘驱动器或记忆棒,并使用它来存储图片。
您还可以缓存图片并一次写出一对,而不是直接写出每张图片以减少SD卡上的负载。这就像在内存中存储5个图片一样简单,一旦你拍了5张图片就把它们写出来。
pictures = {}
pictures[get_timestamp] = image_output
然后,一旦总共有五个条目循环遍历它们,使用该键生成文件名,而值包含实际图片。然后,将所有五个保存在硬盘上。
如果您拥有512MB版本,则可以增加存储在内存中的图片数量,但请记住,如果出现电源故障,您将丢失内存中的任何内容