Вопрос или проблема
Я создаю светодиодную вывеску с помощью Raspberry Pi, где изображения для вывески находятся на USB-накопителе, а файл Python, который является вывеской, находится на самом Raspberry Pi (RPi Zero W, работающий на Raspbian). Я пытаюсь использовать systemd и файл .services с этим руководством, чтобы запустить вывеску сразу после загрузки Pi.
Однако, я думаю, что программа запускается до того, как USB смонтирован или что-то в этом роде, потому что в журналах говорится, что файлы на USB не могут быть найдены. Как мне сделать так, чтобы файл .service ждал, пока USB будет смонтирован, прежде чем запустить программу на Python?
Вот программа myscript.service:
[Unit]
Description=Служба моего скрипта
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/pi/Documents/base.py > /home/pi/Documents/myscript.log 2>&1
[Install]
WantedBy=multi-user.target
USB, на который я хочу подождать, это
/media/pi/0850-9F0E/
Я слышал, что что-то вроде RequiresMountsFor
работает, но я не знаю, как это использовать. Я новичок в технической стороне Linux.
Мне тоже понадобилось некоторое время, чтобы разобраться, но эта тема дала мне ответ. Используйте systemctl status
, чтобы показать юнит. В вашем случае это, вероятно, будет что-то вроде media-pi-0850-9F0E.mount
.
Просто укажите вашей службе, чтобы она запускалась после того, как это будет смонтировано:
After=multi-user.target media-pi-0850-9F0E.mount
Ответ или решение
Для успешного запуска вашего Python-скрипта на Raspberry Pi после монтирования USB-накопителя, вы можете настроить файл .service, используя возможности systemd. Это гарантирует, что ваш скрипт начнет выполняться только после того, как USB-накопитель будет доступен и смонтирован. В этой ответной инструкции мы подробно рассмотрим необходимую конфигурацию и лучшие практики.
Шаг 1: Определите точку монтирования
Сначала необходимо удостовериться в правильности пути к вашему USB-накопителю. Вы упомянули, что точка монтирования вашего устройства имеет вид /media/pi/0850-9F0E/
. С помощью команды lsblk
или df -h
вы можете подтвердить, что устройство действительно монтируется в указанное место.
Шаг 2: Создание или редактирование .service файла
Теперь вам нужно изменить ваш файл myscript.service
. Откройте его для редактирования с помощью текстового редактора:
sudo nano /etc/systemd/system/myscript.service
Пример .service файла
Внутри файла добавьте или измените следующие строки:
[Unit]
Description=My Script Service
After=multi-user.target
RequiresMountsFor=/media/pi/0850-9F0E
[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/pi/Documents/base.py > /home/pi/Documents/myscript.log 2>&1
[Install]
WantedBy=multi-user.target
Разъяснения:
- RequiresMountsFor: Эта строка указывает на то, что ваша служба зависит от успешного монтирования указанного устройства. Таким образом, systemd не будет запускать ваш скрипт до тех пор, пока USB-накопитель не будет доступен.
- After=multi-user.target: Это утверждение гарантирует, что служба будет активирована только после достижения состояния
multi-user
, что является стандартным уровнем работы для многих серверных приложений. - Type=idle: Указывая
Type=idle
, вы гарантируете, что ваша служба будет выполняться после завершения всех других активных задач, что исключает конкуренцию за ресурсы.
Шаг 3: Перезагрузка и активация
После внесения изменений необходимо перезагрузить конфигурацию systemd, чтобы обновления вступили в силу:
sudo systemctl daemon-reload
Теперь, чтобы активировать вашу службу, выполните:
sudo systemctl enable myscript.service
И для старта службы сразу же, если она еще не была запущена:
sudo systemctl start myscript.service
Шаг 4: Проверка работы
Вы можете проверить статус вашей службы, используя следующую команду:
systemctl status myscript.service
Эта команда покажет, запущен ли ваш скрипт, а также любые ошибки, если они возникли.
Заключение
Следуя данным инструкциям, вы можете настроить свою службу так, чтобы она запускалась только после успешного монтирования USB-накопителя. Это улучшит надежность работы вашей системы и исключит возникновение ошибок, связанных с отсутствием файлов. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться за поддержкой в сообществах, посвящённых Raspberry Pi и Linux.