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

Python程序可能导致文件系统错误,python,linux,sleep,raspberry-pi,udev,Python,Linux,Sleep,Raspberry Pi,Udev,概述: 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(i

概述:

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"
我有一个Python程序,可以在9-5小时之间控制一个运动传感器。此程序运行在一个存储在带有occidentals v2.1操作系统的SD介质上的计算机上。该计划在很大程度上依赖于time.sleep方法在非工作时间睡觉,并在第二天上午9点恢复工作。如果传感器触发,它会通过网络摄像头自动拍摄一张小照片

问题:

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"
直到最近,该程序工作正常,直到有一天早上,有人触发了传感器,take_picture()函数未能初始化/dev/video0。udev似乎没有将设备映射到/dev/video*,当我重新插入网络摄像头并用“dmesg | tail”检查其状态时,我收到一个错误:

[36725.201116] EXT4-fs error (device mmcblk0p2): udev
在研究了问题并得出文件系统损坏的结论后,我尝试在SD介质上运行文件系统检查。在此过程中解决了许多错误,但在重新安装USB网络摄像头后,相同的ext4 fs错误消息再次出现

修复尝试#1

此时,我重新安装了操作系统,并重新运行了我的sensor Python程序;它工作了两天,发送图像,然后睡觉。我假设一切正常,所以我关闭设备,将传感器放置在更集中的位置

启动设备并从连接运行
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
在额外的文件系统检查并重新启动后,运行
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"
def take_picture():
cam=pygame.camera.camera(“/dev/video0”,(320240))#最大1280x960,但速度较慢
pygame.init()
cam.start()
打印“捕获图像…”
image\u output=cam.get\u image()
pygame.image.save(图像输出,'img'+str(获取时间戳)+'.jpg')
凸轮停止()
#激活PIR
def pir_init():
尽管如此:
m=datetime.datetime.now().time().minute#循环当前时间
h=datetime.datetime.now().time().hour
d=datetime.datetime.today().weekday()
如果d>4:
打印(“睡眠…”)
打印睡眠时间
睡眠时间=((7-d)*3600)*24)-(h*3600)+(9*3600)
时间睡眠(时间睡眠)
elif h<9:
打印(“睡眠…”)
睡眠时间=(9小时)*3600
时间睡眠(时间睡眠)
elif h>16:
打印(“睡眠…”)
睡眠时间=(24小时)+9)*3600
时间睡眠(时间睡眠)
elif io.输入(pir_引脚):
打印(“PIR报警”)
pygame.camera.init()
时间。睡眠(1.5)
拍照
发送电子邮件
时间。睡眠(10)#冷却以防止电子邮件喷出
其他:
打印“等待…”
时间。睡眠(0.5)#睡眠并等待运动
打印m
打印“等待”
我在上面看到的唯一潜在问题可能是生成图片或长时间睡眠


是什么导致了这些重复的文件系统错误?

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

我认为该代码会导致我看到的问题的唯一原因是,如果它试图太频繁地写入SD卡,这不太可能,也很可能是由潜在问题引起的。也许SD卡坏了,或者是来自坏的一批

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

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

pictures = {}
pictures[get_timestamp] = image_output
然后,在总共达到五个条目后,循环遍历它们,使用键生成文件名,而值包含实际图片。然后将所有五个文件保存在硬盘上


如果您有512 MB的版本,您可以增加存储在内存中的图片数量,但请记住,如果发生电源故障,您将丢失内存中的任何内容。

好的方面,但我认为这里的核心问题是,正如您所说,SD卡坏了和/或无法正常使用RasPi。是的。如果有什么问题的话,他应该避免使用SD卡存储图片,并直接将其存储在FTP上,或者通过电子邮件发送。根据经验,我知道Raspberry Pi上的SD卡是多么不可靠。或者干脆插入USB拇指驱动器并将它们存储在上面。这一定是一张坏SD卡,因为我在过去几周里只向它写入了大约15张图像。由于第一次文件系统损坏而重新加载操作系统后,我再次向该设备写入了总共4个映像,该设备出现了另一个动脉瘤。更新:SD卡是罪魁祸首。我对新的(金斯敦SDHC 8FB 10级)卡进行了压力测试,直到我的G-mail帐户收到200多封电子邮件,因此将我拒之门外。到目前为止,没有发生任何文件系统错误。再次感谢。