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

Raspberry Pi – это мощный одноплатный компьютер (SBC), который можно использовать для различных приложений и проектов. Его универсальность заключается в его способности запускать все виды программ, включая пользовательские скрипты, отчасти благодаря ОС Raspberry Pi и другим операционным системам на базе 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, которые позволяют вам управлять поведением запуска программ и сценариев в системе.

Ниже приводится разбивка шагов, связанных с запуском скрипта / программы при запуске с использованием systemd.

Создание Сервиса

Чтобы программа запускалась при запуске, создайте файл служебного модуля, который сообщит systemd, какую программу запускать и когда. Вот как это сделать.

  1. В окне командной строки введите 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

Все общие параметры конфигурации относятся к разделам « Модуль» и « Установка» , а параметры конфигурации для конкретных служб – в раздел «Служба».

Некоторые из вышеперечисленных пар директива-значение, которые вам может потребоваться изменить, включают:

я. После: определяет, когда запускать службу. Установка его в network.target гарантирует, что указанное значение – в данном случае network.target – запускается до начала текущего блока. Однако он не устанавливает отношения зависимости для запуска службы; это делается с помощью других директив, таких как Wants, Requires и WantedBy.

Конечно, вы можете изменить это значение в соответствии с требованиями вашего проекта. Например, если вы хотите, чтобы ваша программа выполнялась после подключения Raspberry Pi к сети, вы можете использовать значение network-online.target . Вы можете обратиться к документации Fedora по systemd, чтобы узнать больше об этих значениях.

II. ExecStart: содержит абсолютный путь и имя программы / сценария, которые вы хотите выполнить при запуске. Итак, в зависимости от того, что вы хотите выполнить, вам необходимо добавить значения для обеих этих директив.

iii. Пользователь: определяет имя вашего Raspberry Pi. Если вы изменили имя своего Pi, вам нужно указать это значение для пользователя.

iv. WantedBy: это наиболее распространенный способ указания триггера для юнита. Установив для него multi-user.target , вы можете установить отношения зависимости, которые будут запускать программу, когда управление системой передается многопользовательской оболочке.

Более того, это также запускает вашу программу до запуска системы Pi X-Windows, что означает, что ваша программа запускается даже до того, как вы войдете в систему. Если вы хотите, чтобы сценарий запускался до того, как вы войдете в свой Raspberry Pi, это позволит вам это сделать.

Приведенные выше строки кода подходят для программ без графического интерфейса. Однако, если вы хотите запустить программу с графическим интерфейсом пользователя с помощью 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 также позволяет выполнять операции несколькими способами, и она остается верной и для планирования запусков программ. Итак, если вы хотите запускать программы / скрипты с графическим интерфейсом при запуске и хотите лучше контролировать свое планирование, systemd – явно лучший метод.

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