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

Опубликовано: 2022-01-29
Стилизованное окно терминала на ноутбуке.
Фатмавати Ахмад Заэнури/Shutterstock

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

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

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

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

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

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

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

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

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

 сенсорный htg.sh
 gedit htg.sh 

Реклама

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

 #!/бин/баш

echo "htg.service: ## Запуск ##" | systemd-cat -p информация

пока :
делать
TIMESTAMP=$(дата '+%Y-%m-%d %H:%M:%S')
echo "htg.service: отметка времени ${TIMESTAMP}" | systemd-cat -p информация
спать 60
Выполнено

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

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

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

  • Две 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 . Скопируйте и вставьте следующий текст в редактор:

 [Единица измерения]
Description=Пример сервиса How-To Geek

Хочет=network.target
After=syslog.target network-online.target

[Услуга]
Тип=простой
ExecStart=/usr/local/bin/htg.sh
Перезапуск = при сбое
Рестартсек=10
KillMode=процесс

[Установить]
WantedBy=многопользовательская.цель

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

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

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

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

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

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

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

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

 статус systemctl htg.service 

Реклама

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

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

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

 sudo systemctl демон-перезагрузка

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

 sudo systemctl включить htg

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

 sudo systemctl запустить htg 

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

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

 статус sudo systemctl htg.service 

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

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

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

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

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

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

 sudo systemctl остановить htg.service 

Реклама

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

 sudo systemctl отключить htg.service 

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

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

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

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

СВЯЗАННЫЕ С: Лучшие ноутбуки с Linux для разработчиков и энтузиастов