2013-05-04 22 views
3

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

嗨。我有一个Python程序,可以在9-5小时之间控制运动传感器。这个程序运行在一个树莓派上,存储在SD媒体与occidentals v2.1 Debian操作系统。该计划严重依赖time.sleep方法在下班时间休息,并在第二天上午9点恢复工作。如果传感器触发,它会自动通过网络摄像头拍摄一张小图片。

问题:

直到最近,当有人触发了传感器和take_picture程序工作正常,直到有一天早上()函数初始化失败的/ dev/video0的。看来,udev的没有设备映射到/ dev /视频*,并且在网络摄像头,当我重新插好,并检查它与“dmesg的|尾”的地位,我收到了一个错误:

[36725.201116] EXT4-fs error (device mmcblk0p2): udev 

在研究了问题并得出文件系统损坏的结论后,我试图在SD介质上运行文件系统检查。在这个过程中解决了很多错误,但重新安装USB网络摄像头后重新发生了相同的EXT4-fs错误消息。

修复尝试#1

在这一点上我重新安装了操作系统,重新跑我传感器Python程序;两天工作,发送图像,并睡觉。我认为一切正常,因此我关闭了设备,将传感器放置在更集中的位置。

启动设备,并简单地从一个SSH连接运行“蟒蛇”命令后,我收到此错误:

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的尾巴”并获得更多的文件系统错误:

[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) 

额外的文件系统检查并重新启动后,运行“蟒蛇”

[ 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" 

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

任何有关可能导致这些重复的文件系统错误的洞察将不胜感激。提前致谢!

回答

4

SD卡在Raspberry Pi上变得腐败并且此代码不会直接导致此问题很常见。

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

如果您只是简单地将这些邮件作为电子邮件发送,那么它可能是将图片存储在硬盘上的替代方案。或者您可以添加USB硬盘驱动器或记忆棒并使用它来存储照片。

您也可以缓存图片并一次写出一对,而不是直接写出每个图片以减轻SD卡上的负载。这就像存储让5张图片在内存中一样简单,并且一旦你拍摄了5张图片,就把它们写出来。

pictures = {} 
pictures[get_timestamp] = image_output 

然后,一旦你已经达到通过他们一共有5项你循环,使用该密钥而值包含实际的图片生成文件名。然后将所有五个保存在硬盘上。

如果你有512MB的版本,你可以增加存储在内存中的照片数量,但请记住,在发生电源故障,你会在内存

+0

好点失去任何东西的情况下,但我觉得最核心的问题在这里正如你所说的那样,SD卡坏了和/或在使用RasPi时遇到了问题。 – UloPe 2013-05-04 00:36:20

+0

是的。如果有的话,他应该避免使用SD卡存储图片并将其直接存储在FTP上,或通过电子邮件发送。我从经验中了解SD卡在Raspberry Pi上的可靠性。 – eandersson 2013-05-04 00:37:36

+0

甚至只需插入USB拇指驱动器并将它们存储在其上即可。 – UloPe 2013-05-04 00:47:08

相关问题