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

标签 python linux sleep raspberry-pi udev

概述:

我有一个 Python 程序可以在朝九晚五之间控制运动传感器。该程序在 Raspberry Pi 上运行, 存储在带有 occidentals v2.1 的 SD 媒体上 Debian操作系统。该程序严重依赖 time.sleep 方法在下类时间休眠并在第二天早上 9 点恢复工作。如果传感器触发,它会自动通过网络摄像头拍摄一张小照片。

问题:

直到最近该程序运行良好,直到有一天早上有人触发了传感器并且 take_picture() 函数无法初始化/dev/video0。 udev 似乎没有将设备映射到/dev/video*,当我重新插入网络摄像头并使用“dmesg | tail”检查其状态时,我收到一个错误:

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

在研究问题并得出文件系统损坏的结论后,我尝试在 SD 媒体上运行文件系统检查。许多错误在该过程中得到解决,但在重新安装 USB 网络摄像头后再次出现相同的 ext4-fs 错误消息。

修复尝试 #1

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

启动设备并从 SSH 运行 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

在程序运行期间和我重新启动之后之间没有更改任何设置。我假设了最坏的情况并再次检查了 "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 卡上的负载。这就像在内存中存储比方说五张照片一样简单,一旦你拍了五张照片,就把它们写出来。

pictures = {}
pictures[get_timestamp] = image_output

然后,一旦达到总共五个条目,就循环遍历它们,使用键生成文件名,而值包含实际图片。然后,您将所有五个都保存在硬盘上。

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

关于Python 程序可能导致文件系统错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369257/

相关文章:

python - Pandas 重命名列

python - OBD II 不断发送 "7F 01 12"

c - 如何从 C 程序在 Linux 中创建硬链接(hard link)

c++ - 使用 Sleep() 阻止我写入文件

即使键在字典中,Python 也会引发 KeyError(对于字典键外的键)

regex - 使用正则表达式在 linux 中重命名文件

c++ - 并非所有工作项目都在使用 opencl

Java线程随机

java - 在 Java : how does Thread. sleep(int) 工作时等待时间范围?

python - 如何重定向消息以在 Django 模板中显示它们?