systemd

файл на systemd единица, създаващ услуга

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

Със своите услуги, systemd прави всичко това по-лесно, наистина по-лесно. Веднага щом искате нещо, което следи вашето приложение и лесен контрол върху него, systemd е пътят, и това е, което ще обясня тук!

Къде са Systemd Services

За да добавите нова услуга, трябва да отговорите на този въпрос. Както винаги в systemd, зависи дали услугата е само за вашия потребител или за цялата система. Ще се съсредоточим върху това как systemd работи за цели системни услуги.

Точното местоположение зависи от това защо и как е инсталирана услугата. Ако услугата е инсталирана от мениджър на пакети, тя обикновено ще бъде в / usr / lib / systemd / system. За софтуер, който разработвате или за този, който не поддържа systemd сам по себе си, ще поставите файла на услугата в / usr / local / lib / systemd / system. Моля, имайте предвид, че някои дистрибуции не поддържат тази папка в / usr / local. И накрая, ако искате да конфигурирате съществуваща systemd услуга, / etc / systemd / system е пътят.

В тези папки можете да намерите множество файлови разширения като *.гнездо, *.цел или *.обслужване. Очевидно ще се фокусираме върху последното. systemd използва името на файла като име на услугата при стартиране или спиране и т.н. Така че обикновено имената на файлове в услугата съдържат само буквено-цифрови знаци, заедно с тирета и долни черти. По време на разработката препоръчвам да го създадете във вашите документи и след това да го копирате на системно място, когато сте готови, което ще ви избегне проблеми, ако запазите в средата на редактиране.

Добре, така че, моля, създайте вашия сервизен файл във вашите документи. Сега сме готови да прегледаме как да напишем този файл.
[Забележка: Вижте потенциален доклад за грешки в раздела за коментари на този блог]

[Мерна единица]
Описание = HTTP сървър на уеб приложение Penguins (работи в порт 8080)
WantedBy = многопотребителски.мишена
 
[Обслужване]
Тип = просто
ExecStart = / usr / bin / python3 / usr / local / bin / penguin-web-app / main.py
Рестартиране = винаги

Файловият формат всъщност е близък до ini. Знам, че може да е странно, тъй като ini файловете често се намират в Windows, но така работи. Файлът за услуга първо е разделен на 2 раздела: [Unit] и [Service]. Всеки раздел конфигурира специфичен аспект на systemd: [Unit] съдържа елементи, споделени от всички файлове на systemd unit, докато [Service] е само за конфигурация, специфична за настройване на нова услуга.

Тогава секцията се конфигурира със свойства като Description = или ExecStart =. Стойността се отделя от името на свойството със знака за равенство = без интервал.

Да се ​​върнем към файла, показан по-горе. Той описва услуга, предназначена за стартиране на уеб приложение, написано на Python за пингвини. systemd ще го рестартира всеки път, когато процесът излезе и стартира сървъра при стартиране на сървъра, ако го активирате с командата systemctl enable. Готино а?

Но вие може би следващото ви уеб приложение не е свързано с пингвини - и това е жалко - и не е написано на Python. В този случай ще искате да научите повече за възможните конфигурации.

Свойства на Systemd Services

Нека първо се съсредоточим върху свойствата в [Unit]:

Описание = е просто да се даде ясно описание на това, което услугата прави. Показва се в списъка с услуги, регистрационните файлове на услугата, така че искате да е описателен, но трябва да остане в един ред и едно изречение.

WantedBy = позволява да се каже на systemd: когато това нещо се стартира, стартира и мен. Обикновено ще поставите името на целта. Примери за общи цели:

  1. многопотребителски.target: когато сървърът е наред и е готов за стартиране на приложения от командния ред
  2. графичен.target: когато GNOME или KDE са готови
  3. мрежова връзка.цел: когато сървърът е свързан правилно към мрежа

ОК за началото тези свойства на [Unit] са достатъчни. Нека да разгледаме [Service] сега.

Type = помага на systemd да разбере дали услугата работи. Ето често срещани типове:

  1. simple е може би най-често използваният: systemd счита процеса, който стартирате, като този, който извършва услугата. Ако процесът спре, той счита, че услугата също е спряна и т.н.
  2. forking се предпочита за приложения, които са написани като сървър, но без помощта на система за управление на услуги. По принцип той очаква стартираният процес да се форкира и този форк се счита за финален процес за услугата. За да бъдете по-точни, можете също да помогнете на systemd с PID файл, където PID на процеса за проследяване се записва от стартиралото приложение.

ExecStart = е може би най-важният за дадена услуга: той уточнява какво приложение да стартира при стартиране на услугата. Както можете да видите в услугата Penguin, използвах / usr / bin / python3, а не python3 веднага. Това е така, защото системната документация изрично препоръчва да се използват абсолютни пътеки, за да се избегнат изненади.

Но това е и по друга причина. Системата за управление на други услуги обикновено се основава на скриптове на Shell. Въпреки това systemd, поради причини за производителност, не изпълнява черупка по подразбиране. Така че не можете да предоставите директно команда на черупката в ExecStart =. Все пак можете да използвате скрипт на обвивка, като направите:

ExecStart = / usr / bin / bash / usr / local / bin / launch-penguin-server.ш

Не е толкова трудно, нали? Имайте предвид, че ако трябва да стартирате някакъв процес, за да сигнализирате, че вашата услуга спира чисто, ExecStop = съществува, както и ExecReload = за презареждане на услуги.

Restart = ви позволява изрично да кажете кога услугата трябва да бъде рестартирана. Това е една от важните характеристики на systemd: тя гарантира, че услугата ви остава постоянна, докато желаете, така че обръщайте голямо внимание на тази опция.

Рестартиране = Значение
винаги systemd ще продължи да го рестартира, когато прекрати или се срине. Е, докато не направите systemctl спрете име на услуга.обслужване.

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

на-ненормално Когато процесът на услугата се срине, рестартирайте услугата. Ако обаче приложението излезе чисто, не го рестартирайте.

Това е по-полезно за cron-работни места като услуги, които трябва да изпълняват задача надеждно, но не трябва да се изпълняват през цялото време.

при неуспех Подобно на on-abnormal, но също така рестартира услугата, когато приложението излезе чисто, но с ненулев код за изход. Ненулевите кодове за изход обикновено означават грешка.
не systemd няма да рестартира услугата автоматично.

Обикновено полезно за получаване на достъп до други системни функции, като регистриране без функцията за рестартиране.

WorkingDirectory = може да наложи работеща директория при стартиране на вашето приложение. Стойността трябва да е абсолютен път на директорията. Работната директория се използва, когато използвате относителни пътища в кода на вашето приложение. За нашата услуга за пингвини това може да бъде:

WorkingDirectory = / srv / penguin-web-app /

Тогава сигурността е важна, така че обикновено искате да не стартирате услугата си с root права. User = и Group = ви позволява да зададете името на потребителя или групата или UID / GID, под които вашето приложение ще бъде стартирано. Например:

Потребител = пингвин-мрежа
Група = пингвин-мрежа

EnvironmentFile = е мощен вариант. Приложенията, изпълнявани като услуги, често се нуждаят от конфигурация и файловете на околната среда позволяват да зададете тази конфигурация по два начина:

  1. Приложението може да чете директно променливата на околната среда.
  2. Но също така можете да зададете различни аргументи на командния ред на вашето приложение, без да променяте файла на услугата.

Синтаксисът на този файл е прост: въвеждате името на променливата на средата, знакът за равенство = и след това нейната стойност. След това поставяте абсолютния път на файла на вашата среда в свойството EnvironmentFile.

Така че пример:

EnvironmentFile = / etc / penguin-web-app / environment

И файлът / etc / penguin-web-app / environment съдържа:

LISTEN_PORT = 8080

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

Запазете и стартирайте новосъздадената Systemd услуга

Така че, ако последвахте съвета ми, редактирахте вашия файл с услуги в домашната си директория. След като сте доволни, копирайте този файл в / usr / local / lib / systemd / system, като приемете, че вашата дистрибуция поддържа този път. Името на файла на вашия сервизен файл ще бъде неговото име на услуга. Това име на файл трябва да завършва с .обслужване. Например за нашия сървър за пингвини това би било приложението за пингвини в мрежата.обслужване.

След това трябва да кажете на systemd, че сте добавили нова услуга, така че трябва да въведете тази команда:

$ sudo systemctl daemon-reload

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

Сега е време да стартирате услугата:

$ sudo systemctl стартирайте приложението за пингвини.обслужване

Ако не успее с грешка Unit not found като тази:

$ sudo systemctl стартирайте приложението за пингвини.обслужване
Стартирането на уеб приложението на пингвин не бе успешно.услуга: Единицата не е намерена.

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

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

$ sudo systemctl активира приложението на пингвин-уеб.обслужване

Готиното с услугата е, че тя работи във фонов режим. Проблемът: как да разберете дали тя работи правилно и дали тя работи във фонов режим? Не се притеснявайте, системният екип помисли и за това и предостави команда, за да види дали работи правилно, от колко време и т.н.:

$ systemctl статус penguin-web-app.обслужване

Заключение

поздравления! Вече можете да управлявате приложенията си, без да се грижите всеки път да го рестартирате ръчно. Сега ви препоръчвам да прочетете другата ни статия за системните регистрационни файлове: Master journalctl: разбирайте системните регистрационни файлове. С това можете да използвате мощната система за регистриране на новата си услуга и да изградите по-надеждни сървъри!

Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...