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多封电子邮件,因此将我拒之门外。到目前为止,没有发生任何文件系统错误。再次感谢。