Нужно настроить запуск программ при загрузке Raspberry Pi? Это можно сделать с помощью systemd – вот как
Raspberry Pi – это мощный SBC (одноплатный компьютер), который можно использовать для различных приложений и проектов. Его универсальность заключается в способности запускать всевозможные программы, включая пользовательские сценарии, отчасти благодаря Raspberry Pi OS и другим операционным системам на базе Linux, под управлением которых он работает
Запустить скрипт или программу на Raspberry Pi очень просто – достаточно найти его в системе и выполнить. Но что если вы хотите автоматизировать этот процесс, возможно, потому что этого требует ваш проект или потому что вы хотите упорядочить свой рабочий процесс?
Один из ответов на этот вопрос – научиться использовать systemd
Что такое Systemd?
systemd – это набор системных компонентов для конфигурации и поведения служб в современных системах Linux. Он идентифицируется с PID (идентификатором процесса), равным 1, поскольку это первый процесс, загружающийся при старте системы. В целом, цель systemd – помочь вам в управлении и выполнении программ при запуске системы. И это то, что вы будете использовать для запуска своей программы при старте на Pi
Как уже упоминалось, существует несколько методов запуска программ при старте в системах Linux, таких как rc.local, cron и autostart. Однако systemd оказывается лучшим решением из всех, если вы хотите запускать программы GUI (графический интерфейс пользователя), автоматизировать запуск приложений после начала определенных системных процессов или запускать программы снова и снова, пока ваше планирование не сработает
Похожие: Как планировать задачи в Linux с помощью Cron и Crontab
Как использовать systemd для запуска программ при старте
systemd – это немного более сложный метод запуска программ при старте в системах Linux. Однако гибкость планирования, которую он предлагает по сравнению с другими методами – теми, о которых мы говорили выше, – полностью перевешивает его сложность во всех аспектах
Метод systemd использует файлы модулей, которые являются своего рода.ini файлами, содержащими кодирующую информацию об устройствах, сервисах, сокетах, цели запуска и других важных компонентах системы
Юнит-файлы бывают разных типов. Поэтому, исходя из того, какой ресурс вы хотите объявить, вам нужно выбрать соответствующий тип юнит-файла. Для целей данного руководства мы будем придерживаться.service unit files, которые позволяют управлять стартовым поведением программ и скриптов в системе
Ниже описаны шаги, связанные с запуском скрипта/программы при старте системы с помощью systemd
Создание службы
Чтобы настроить запуск вашей программы при запуске, создайте файл сервисного блока, который будет указывать systemd, какую программу и когда запускать. Вот как это сделать
- В окне CLI введите sudo nano /lib/systemd/system/display.service. Вы можете использовать любое имя для вашей службы, если оно заканчивается расширением.service.
- В файл сервиса вставьте следующие строки кода:
Unit Description=PiCounter After=network.target. Service ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py Restart=always User=pi. Install WantedBy=multi-user.target
.
Все общие параметры конфигурации относятся к разделам Unit и Install , в то время как параметры конфигурации, относящиеся к конкретной службе, относятся к разделу Service
Некоторые из приведенных выше пар ‘директива-значение’, которые вам может понадобиться изменить, включают:
i. After: Определяет, когда запускать службу. Установка его в network.target гарантирует, что перечисленное значение – network.target в данном случае – запустится до начала текущего блока. Однако он не определяет отношения зависимости для запуска службы; это делается с помощью других директив, таких как Wants, Requires и WantedBy
Конечно, вы можете изменить это значение в соответствии с требованиями вашего проекта. Например, если вы хотите, чтобы ваша программа выполнялась после подключения Raspberry Pi к сети, вы можете использовать значение network-online.target. Вы можете обратиться к документации Fedora по systemd, чтобы узнать больше об этих значениях
ii. ExecStart: Здесь содержится абсолютный путь и имя программы/скрипта, который вы хотите выполнить при запуске. Поэтому в зависимости от того, что вы хотите выполнить, вам нужно добавить значения для обеих этих директив
iii. User: Здесь указывается имя вашего Raspberry Pi. Если вы изменили имя вашего Pi, вам нужно добавить это значение для user
iv. WantedBy: Это наиболее распространенный способ указания триггера для устройства. Установив его в multi-user.target , вы можете установить зависимость, которая будет запускать программу, когда управление системой будет передано многопользовательской оболочке
Более того, это также запускает вашу программу до запуска системы X-Windows Pi, что означает, что ваша программа будет запущена еще до того, как вы войдете в систему. Если вы хотите, чтобы скрипт запускался до того, как вы войдете в систему Raspberry Pi, это позволит вам сделать это
Приведенные выше строки кода работают для программ без графического интерфейса. Однако если вы хотите запустить GUI-программу с помощью systemd, вам следует добавить следующий код в ваш служебный файл:
Unit
Description=PiCounter
After=network.target.
Service
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always.
Install
WantedBy=multi-user.target
В приведенной выше паре директива-значение все, что вам нужно изменить, это значение директивы ExecStart. Замените ее в кодовом блоке на программу, которую вы хотите запускать при старте. После того как вы заполнили служебный файл, нажмите CTRL + O , чтобы сохранить его
Протестируйте сервис
Когда служба готова, проверьте вручную, работает ли она. Для этого введите в терминале следующую команду: sudo systemctl start display.service. Служба должна успешно выполнить ваши инструкции
Как только это произойдет, завершите его работу с помощью sudo systemctl stop display.service
Включите службу
Если вам удалось успешно запустить свою программу с помощью сервиса, пришло время включить его, чтобы он выполнял вашу программу автоматически при каждой загрузке Raspberry Pi
Для этого в окне терминала введите sudo systemctl enable display.service. После этого введите sudo reboot , чтобы перезагрузить Pi
После загрузки Raspberry Pi, systemd должен запустить вашу программу в соответствии с предоставленными инструкциями
Автоматизация запуска программ при старте на Raspberry Pi
Как и большинство Linux-систем, Raspberry Pi OS также позволяет выполнять операции несколькими способами, и она остается верной и в отношении планирования запуска программ. Итак, если вы хотите запускать GUI-программы/скрипты при старте и хотите лучше контролировать планирование, systemd явно лучший метод
Тем не менее, если вам нужно более простое решение или требования вашего проекта требуют особого планирования, вы можете ознакомиться с нашим руководством по запуску программы или скрипта Raspberry Pi при старте, чтобы узнать больше
Комментировать