Ошибка разрешения Linux Python № 13 после отключения электроэнергии: причины и решения

Проблемы с записью файлов на Raspberry Pi после отключения электроэнергии

Отключение электроэнергии может привести к различным неполадкам в системах, которые активно работают с файлами и процессами. В этой статье мы рассмотрим ситуацию, которая возникла у пользователя Raspberry Pi, связанная с запуском демона и проблемами записи в файлы после перезагрузки системы.

Ситуация

В 4 часа утра произошло отключение электроэнергии, что привело к необходимости перезапуска службы на Raspberry Pi. Пользователь подключился к устройству в 8:00 и запустил демон вручную с использованием команды:

sudo systemctl start getdata.service

Несмотря на то что демон запустился, пользователю стало ясно, что в файлы журналов перестало записываться какое-либо сообщение, как это было ранее. При запуске скрипта вручную возникла ошибка PermissionError, указывающая на то, что файл не доступен для записи.

Причина проблемы

Ошибка PermissionError: [Errno 13] Permission denied возникает из-за того, что файл, в который пытался записать скрипт, был заблокирован. При запуске демона процесс работает под пользователем root, тогда как доступ к файлам требуется для обычного пользователя. Это и стало причиной, по которой скрипт не смог записать данные в файл.

Решение проблемы

Для того чтобы устранить эту проблему, пользователь решил изменить конфигурацию системного сервиса, который управляет запуском демон-программы:

[Service]
Type=simple
User=bernard
WorkingDirectory=/home/bernard/p1meter
ExecStart=/bin/sh getdata.sh
Restart=on-failure
RestartSec=10

Теперь демон будет запускаться не от имени root, а от имени пользователя bernard, что позволяет избежать конфликтов с правами доступа.

Корректное завершение работы скрипта

Еще одной проблемой, с которой столкнулся пользователь, было некорректное завершение работы скрипта. При остановке демона файл не закрывался, что также приводило к ошибкам. Для устранения этой ситуации в скрипт были добавлены функции для корректной обработки сигнала завершения:

import signal

class Kill:
    bKill = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_properly)
        signal.signal(signal.SIGTERM, self.exit_properly)

    def exit_properly(self, signum, frame):
        self.bKill = True

killer = Kill()
InitProcess()
while not killer.bKill:
    DoJob()

WriteAllMeasures()
CloseDataFile()

Таким образом, добавленная обработка сигналов позволяет корректно закрывать открытые файлы и завершать работу скрипта, что обеспечивает правильное назначение прав доступа.

Рекомендации для пользователей Raspberry Pi

  1. Используйте корректные права доступа: Позаботьтесь о том, чтобы ваши процессы работали от имени обычного пользователя, а не root, если это не требуется.

  2. Обработка сигналов: Настраивайте обработку сигналов в ваших скриптах для корректного завершения открытых файлов и освобождения ресурсов.

  3. Регулярно проверяйте журналы: Анализируйте файлы журналов для выявления возможных ошибок или сбоев.

  4. Создавайте резервные копии данных: Внешние отключения могут привести к повреждению данных, поэтому регулярное резервное копирование может помочь избежать потерь.

Следуя этим рекомендациям и применяя полученные знания, вы сможете избежать проблем, связанных с правами доступа и некорректным завершением служебных процессов на Raspberry Pi.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *