Поиск по сайту:

Как запустить программу Linux при запуске с помощью systemd


Нужно запустить программу Linux при загрузке? Программное обеспечение systemd предоставляет способ сделать это в любом дистрибутиве Linux с systemd, а это большинство из них в наши дни, включая Ubuntu. Мы проведем вас через процесс создания интегрированного сервиса — и он даже общается с журналом.

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

Запуск программ при запуске

Иногда программное обеспечение, которое вы устанавливаете на свой компьютер, подключается к процессу запуска Linux, так что программа автоматически запускается при каждом включении компьютера. Вы можете легко добиться такого же поведения с помощью своих собственных программ и скриптов или любой другой программы, установленной на вашем компьютере.

Программы, которые запускаются при запуске, контролируются systemd, системным и сервисным менеджером. systemd — это первый процесс, который запускается при запуске. Он всегда имеет идентификатор процесса (PID) 1. Каждый другой процесс, запущенный на вашем компьютере, запускается systemd или процессом, который systemd уже запущен.

Программы, работающие в фоновом режиме, называются демонами или службами. Буква «d» в конце systemd означает демон. В этой статье мы создадим пример службы. Чтобы поставить все галочки, наш сервис должен быть:

  • Интегрирован с systemd через файл сервисного модуля.
  • Запускается при запуске
  • Управляется с помощью systemctl, управляющего интерфейса для systemd
  • Возможность писать в журнал

Создание сервисной программы

Нам нужна программа, которую запустит systemd. Мы создадим простой скрипт под названием «htg.sh». В этом руководстве используется текстовый редактор Gedit, но вы можете использовать любой текстовый редактор по своему усмотрению.

touch htg.sh
gedit htg.sh

Откроется редактор gedit. Скопируйте и вставьте следующий текст в редактор.

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Сохраните изменения и закройте редактор.

Скрипт не очень много делает, но есть несколько моментов, на которые стоит обратить внимание.

  • Две строки echo передаются через systemd-cat, программу, которая берет выходные данные из программы и отправляет их в журнал. Записи в журнале имеют приоритет. Мы используем параметр -p (приоритет), чтобы указать, что наши сообщения предназначены только для информации (информации). Это не важные ошибки или предупреждения.
  • Имеется бесконечный цикл while.
  • Переменной TIMESTAMP присваиваются текущие дата и время. Это форматируется в сообщение и отправляется в журнал.
  • Затем скрипт приостанавливается на 60 секунд.
  • Через 60 секунд цикл повторяется. Итак, этот скрипт записывает в журнал сообщение с отметкой времени раз в минуту.

Скопируем скрипт в каталог /usr/local/bin.

sudo cp htg.sh /usr/local/bin

И нам нужно сделать его исполняемым:

sudo chmod +x /usr/local/bin/htg.sh

Создание файла сервисной единицы

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

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

sudo systemctl list-unit-files --type-service

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

Наш сервис будет называться «htg.service». Ни у одного файла модуля нет такого имени, поэтому мы можем продолжить и создать наш файл модуля.

sudo gedit /etc/systemd/system/htg.service

Откроется редактор gedit. Скопируйте и вставьте в редактор следующий текст:

[Unit]
Description=How-To Geek Service Example

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Сохраните изменения и закройте редактор.

Записи имеют эти значения. Это типичные записи. Наш простой сервис на самом деле не нуждается в большинстве из них, но включение их позволяет нам объяснить их.

  • Описание. Это текстовое описание вашего сервиса.
  • Хочется. Наша служба хочет, но не требует, чтобы сеть работала до запуска службы.
  • После. Список имен объектов, которые должны быть запущены после успешного запуска этой службы, если они еще не запущены.
  • Тип: простой. systemd будет считать эту службу запущенной, как только процесс, указанный в ExecStart, будет разветвлен.
  • ExecStart: путь к процессу, который должен быть запущен.
  • Перезапуск. Когда и следует ли перезапускать службу. Мы установили для него значение «при сбое».
  • RestartSec: сколько времени ждать перед попыткой перезапуска службы. Это значение указано в секундах.
  • KillMode: определяет, как systemd должен завершить процесс, если мы попросим systemctl остановить службу. У нас есть этот набор для «обработки». Это заставляет systemd использовать сигнал SIGTERM только в основном процессе. Если бы наш сервис был нетривиальной программой, а не простым скриптом, мы бы установили для него значение «смешанный», чтобы гарантировать, что любые порожденные процессы также будут завершены.
  • WantedBy: мы установили значение «multi-user.target», что означает, что служба должна быть запущена, пока система находится в состоянии, когда несколько пользователей могут войти в систему, независимо от того, отсутствует графический интерфейс пользователя.

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

Эта команда предоставит владельцу права на чтение и запись, а также права на чтение для группы. У других не будет разрешений.

sudo chmod 640 /etc/systemd/system/htg.service

Мы можем заставить systemctl проверять синтаксис нашего файла модуля, даже если служба еще не запущена. О любых ошибках будет сообщено. (На самом деле часть «.service» является необязательной для большинства команд.)

systemctl status htg.service

Никакие ошибки не выделены, что означает, что наш юнит-файл синтаксически верен.

Запуск службы

Когда вы добавляете новый юнит-файл или редактируете существующий, вы должны указать systemd перезагрузить определения юнит-файла.

sudo systemctl daemon-reload

Если вы хотите, чтобы служба запускалась при запуске, вы должны включить ее:

sudo systemctl enable htg

Включение службы не запускает ее, а только устанавливает ее запуск во время загрузки. Чтобы запустить службу сейчас, необходимо использовать systemctl с параметром start.

sudo systemctl start htg

Проверка службы

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

sudo systemctl status htg.service

Статус услуги отображается для нас.

  • Зеленая точка означает, что наш сервис работает без сбоев.
  • Название службы — «htg.service», а подробное описание — это то, что мы предоставили в файле модуля.
  • Нам показано, какой файл модуля был загружен «/etc/systemd/system/htg.service».
  • Служба активна, и для нас указано время ее запуска.
  • Его PID – 7762.
  • С сервисом связаны две задачи.
  • Служба использует в общей сложности 928 Кибибайт памяти.
  • Группа управления включает сценарий «htg.sh» и команду sleep, запускаемую «htg.sh». Большую часть времени за эту службу будет выполняться команда sleep.

Нам также показаны последние 10 записей журнала, созданных этой службой. Неудивительно, что все они с разницей в одну минуту.

Остановка и отключение службы

Если вам нужно остановить службу, вы можете сделать это с помощью этой команды:

sudo systemctl stop htg.service

Это останавливает службу, но не препятствует ее перезапуску при следующей перезагрузке компьютера. Чтобы служба не запускалась при запуске, ее нужно отключить:

sudo systemctl disable htg.service

Если служба запущена, эта команда не останавливает ее. Он просто сообщает systemd не запускать службу при следующей перезагрузке.

Если вы хотите остановить службу и предотвратить ее запуск при запуске, используйте обе команды.

Сервисный совет

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

RELATED: Best Linux Laptops for Developers and Enthusiasts