Python程序可能导致文件系统错误?

2024-05-28 20:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

概述:

嗨。我有一个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"

我在上面看到的唯一潜在问题可能是生成图片或长时间睡眠。在

如果能深入了解导致这些重复文件系统错误的原因,我们将不胜感激。提前谢谢!在


Tags: datetimetimedevice错误sleeperrorfsextent
1条回答
网友
1楼 · 发布于 2024-05-28 20:39:37

SD卡在Raspberry Pi上损坏是很常见的,而这段代码并不能直接导致这种情况。在

我认为代码会引起问题的唯一原因是,如果它太频繁地尝试写入SD卡,这不太可能,也很可能是由潜在问题引起的。也许SD卡坏了。在

如果你只是简单地以电子邮件的形式发送这些图片,那可能是一个完全不把图片存储在硬盘上的替代方法。或者你可以添加一个USB硬盘或记忆棒来存储图片。在

你也可以缓存图片,一次写几张,而不是直接把每一张都写出来,以减少SD卡的负载。这就像在内存中存储5张图片一样简单,一旦你拍了5张照片,就把它们写出来。在

pictures = {}
pictures[get_timestamp] = image_output

然后,一旦您达到了总共五个条目,您就可以在值包含实际图片的情况下使用该键生成文件名。然后把这五个都保存在硬盘上。在

如果你有512MB的版本,你可以增加存储在内存中的图片的数量,但是要记住,如果停电,你会丢失内存中的任何东西

相关问题 更多 >

    热门问题