概述:
嗨。我有一个python程序,可以在9点到5点之间控制一个运动传感器。这个程序运行在raspberry pi上,它存储在使用occidentals v2.1 Debian操作系统的SD介质上。该计划在很大程度上依赖于时间。睡觉方法休息时间睡觉,次日上午9点恢复工作。如果传感器触发,它会通过网络摄像头自动拍摄一张小照片。在
问题:
直到最近,程序运行良好,直到有一天早上有人触发传感器,take_picture()函数未能初始化/dev/video0。udev似乎没有将设备映射到/dev/video*,当我重新插入网络摄像头并用“dmesg | tail”检查其状态时,我收到一个错误:
[36725.201116] EXT4-fs error (device mmcblk0p2): udev
在研究了问题并得出了文件系统损坏的结论后,我试图在SD介质上运行文件系统检查。在这个过程中,很多错误都得到了解决,但是在重新安装usb网络摄像头之后,相同的ext4fs错误消息再次出现。在
修复尝试1
在这一点上,我重新安装了操作系统,并重新运行了我的sensorpython程序;它工作了两天,发送了图像,然后睡着了。我假设一切正常,所以我关闭设备,把传感器放在更集中的位置。在
启动设备并从ssh连接运行“python”命令后,我收到以下错误:
^{pr2}$在程序运行期间和重新启动之后,没有更改任何设置。我假设了最坏的情况,再次检查了“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"
我在上面看到的唯一潜在问题可能是生成图片或长时间睡眠。在
如果能深入了解导致这些重复文件系统错误的原因,我们将不胜感激。提前谢谢!在
SD卡在Raspberry Pi上损坏是很常见的,而这段代码并不能直接导致这种情况。在
我认为代码会引起问题的唯一原因是,如果它太频繁地尝试写入SD卡,这不太可能,也很可能是由潜在问题引起的。也许SD卡坏了。在
如果你只是简单地以电子邮件的形式发送这些图片,那可能是一个完全不把图片存储在硬盘上的替代方法。或者你可以添加一个USB硬盘或记忆棒来存储图片。在
你也可以缓存图片,一次写几张,而不是直接把每一张都写出来,以减少SD卡的负载。这就像在内存中存储5张图片一样简单,一旦你拍了5张照片,就把它们写出来。在
然后,一旦您达到了总共五个条目,您就可以在值包含实际图片的情况下使用该键生成文件名。然后把这五个都保存在硬盘上。在
如果你有512MB的版本,你可以增加存储在内存中的图片的数量,但是要记住,如果停电,你会丢失内存中的任何东西
相关问题 更多 >
编程相关推荐