Как запустить программу 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

коснитесь 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

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

  7 лучших темных тем для Linux в 2019 году

скрипт htg.sh в редакторе gedit

Сценарий мало что делает, но стоит отметить несколько моментов.

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

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

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin в окне терминала

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

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

sudo chmod + x /usr/local/bin/htg.sh в окне терминала

Создание файла служебной единицы

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

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

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

sudo systemctl list-unit-files --type-service в окне терминала

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

Список файлов модулей systemd в окне терминала

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

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

sudo gedit /etc/systemd/system/htg.service в окне терминала

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

[Unit]
Description=toadmin.ru 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

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

файл модуля htg.service в редакторе gedit

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

  Как настроить и использовать BitTorrent-клиент Fragments в Linux

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

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

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

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

sudo chmod 640 /etc/systemd/system/htg.service в окне терминала

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

systemctl status htg.service

systemctl status htg.service в окне терминала

Ошибки не выделяются, что означает, что наш файл модуля синтаксически верен.

  5 альтернатив Microsoft Powerpoint для пользователей Linux

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

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

sudo systemctl daemon-reload

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

sudo systemctl enable htg

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

sudo systemctl start htg

sudo systemctl daemon-reload в окне терминала

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

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

sudo systemctl status htg.service

sudo systemctl status htg.service в окне терминала

Нам отображается статус услуги.

Статус htg.service в окне терминала

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

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

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

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

sudo systemctl stop htg.service

sudo systemctl stop htg.service в окне терминала

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

sudo systemctl disable htg.service

sudo systemtctl отключить htg.service в окне терминала

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

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

Совет по обслуживанию

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