Как да стартирате програма за Linux при стартиране със systemd

Трябва да стартирате програма за Linux при стартиране? Софтуерът systemd предоставя начин да го направите във всяка дистрибуция на Linux със systemd – което е повечето от тях в наши дни, включително Ubuntu. Ще ви преведем през процеса на създаване на интегрирана услуга – и тя дори говори със списанието.

Този урок демонстрира как да настроите системна услуга, която се стартира, когато стартирате вашата система. За да стартирате графична програма, когато влезете, използвайте вместо това мениджъра за стартиране на работния плот.

Стартиране на програми при стартиране

Понякога софтуерът, който инсталирате на вашия компютър, се включва в процеса на стартиране на Linux, така че програмата се стартира автоматично всеки път, когато компютърът се стартира. Можете лесно да постигнете същото поведение с вашите собствени програми и скриптове или всъщност всяка друга програма, която е на вашия компютър.

Програмите, които се стартират при стартиране, се контролират от systemd, система и обслужване мениджър. systemd е първият процес, който се изпълнява при стартиране. Винаги е имало ID на процеса (PID) 1. Всеки друг процес, изпълняван във вашия компютър, се стартира от systemd или от процес, който systemd вече е стартирал.

Извикват се програми, които работят във фонов режим демони или услуги. „d“ в края на systemd означава демон. В тази статия ще създадем примерна услуга. За да поставите отметка във всички квадратчета, нашата услуга трябва да бъде:

Интегриран със systemd чрез файл на сервизна единица
Стартира се при стартиране
Управлява се с помощта на systemctl, the контролен интерфейс за 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

Запазете промените и затворете редактора.

  Как да поставите на пауза Bash скрипт с командата за заспиване на Linux

Сценарият не прави много, но има няколко точки, които си струва да се отбележат.

Двете ехо линии се предават чрез 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

Запазете промените и затворете редактора.

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

  Как ръчно да разделите твърд диск от командния ред на Linux

Описание: Това е текстово описание на вашата услуга.
Иска: Нашата услуга иска — но не изисква — мрежата да бъде включена, преди услугата ни да бъде стартирана.
След: Списък с имена на единици, които трябва да бъдат стартирани, след като тази услуга е стартирана успешно, ако те вече не се изпълняват.
Тип: прост. 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

Не са подчертани грешки, което означава, че нашият файл с единица е синтактично правилен.

  Как да играете Baldur's Gate 3 на Linux

Стартиране на услугата

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

sudo systemctl daemon-reload

Ако искате дадена услуга да се стартира при стартиране, трябва да я активирате:

sudo systemctl enable htg

Активирането на услуга не я стартира, а само я настройва да се стартира при стартиране. За да стартирате услугата сега, трябва да използвате systemctl с опцията за стартиране.

sudo systemctl start htg

Проверка на услугата

След ръчно стартиране на услугата или след рестартиране на компютъра, можем да проверим дали услугата ни работи правилно.

sudo systemctl status htg.service

За нас се показва състоянието на услугата.

Зелената точка означава, че нашата услуга работи и работи гладко.
Името на услугата е “htg.service”, а дългото описание е това, което предоставихме във файла на модула.
Показва ни се кой единичен файл е зареден “/etc/systemd/system/htg.service”.
Услугата е активна и за нас е посочен часът на стартиране на услугата.
Неговият PID е 7762.
Има две задачи, свързани с услугата.
Общо 928 Кибибайти памет се използват от услугата.
Контролната група включва скрипта „htg.sh“ и командата за заспиване, която е стартирана от „htg.sh“. През повечето време командата за заспиване ще върши работата за тази услуга.

Показани са ни и последните 10 записа в дневника, създадени от тази услуга. Не е изненадващо, че всички те са една минута.

Спиране и деактивиране на услугата

Ако трябва да спрете услугата, можете да го направите с тази команда:

sudo systemctl stop htg.service

Това спира услугата, но не й пречи да се рестартира следващия път, когато компютърът се рестартира. За да спрете стартирането на услугата при стартиране, трябва да я деактивирате:

sudo systemctl disable htg.service

Ако услугата работи, тази команда не я спира. Той просто казва на systemd да не стартира услугата при следващото рестартиране.

Ако искате да спрете услугата и да предотвратите стартирането й при стартиране, използвайте и двете команди.

Съвет за обслужване

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