Как использовать systemd для запуска программ при старте на Raspberry Pi
СДЕЛАЙ САМ

Как использовать systemd для запуска программ при старте на Raspberry Pi

Нужно настроить запуск программ при загрузке 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, какую программу и когда запускать. Вот как это сделать

  1. В окне CLI введите sudo nano /lib/systemd/system/display.service. Вы можете использовать любое имя для вашей службы, если оно заканчивается расширением.service.
  2. В файл сервиса вставьте следующие строки кода:
     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 при старте, чтобы узнать больше

Теги

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий