Plik jednostki systemowej tworzenie usługi

Plik jednostki systemowej tworzenie usługi
Zarządzanie usługami jest czymś, o czym nawet nie myślisz, gdy używasz codziennego serwera Linux lub serwera Linux, ale kiedy go nie ma, naprawdę go nienawidzisz. Kiedy tworzysz na przykład nowy program serwerowy, który musi uruchomić 24 godziny na dobę, 7 dni w tygodniu, robienie tego wyzwania bez zarządzania usługami jest koszmarem, w którym sam tworzysz mały system usług, który oczywiście nie będzie tak dobry, jak menedżer opracowany przez A W każdym razie pełny zespół przez lata.

Dzięki swoim usługom SystemD ułatwia to wszystko łatwiejsze, bardzo łatwiejsze. Jak tylko chcesz coś monitorującego Twoją aplikację i łatwą kontrolę, SystemD to droga, i to właśnie wyjaśnię tutaj!

Gdzie są usługi systemowe

Aby dodać nową usługę, musisz odpowiedzieć na to pytanie. Jak zawsze w SystemD, zależy to, czy usługa jest tylko dla użytkownika lub całego systemu. Skoncentrujemy się na tym, jak systemd działa dla całego usługi systemowej.

Dokładna lokalizacja zależy od tego, dlaczego i jak została zainstalowana usługa. Jeśli usługa zostanie zainstalowana przez menedżera pakietów, będzie ona ogólnie w/usr/lib/systemd/system. W przypadku tworzenia oprogramowania lub tych, które nie obsługują systemu samodzielnie, umieścisz plik usługi w/usr/local/lib/systemd/system. Pamiętaj jednak, że niektóre dystrybucje nie obsługują tego folderu w /usr /lokalnym. Wreszcie, jeśli chcesz skonfigurować istniejącą usługę SystemD,/etc/systemd/system to droga.

W tych folderach można znaleźć wiele rozszerzeń plików, takich jak *.gniazdo elektryczne, *.cel lub *.praca. Oczywiście skupimy się na ostatnim. SystemD używa nazwy pliku jako nazwy usługi podczas jej uruchamiania lub zatrzymywania itp. Tak więc ogólnie nazwy plików w serwisie zawierają tylko znaki alfanumeryczne wraz z łącznikami i podkreśleniami. Podczas opracowywania zalecam utworzenie go w swoich dokumentach, a następnie skopiowanie do lokalizacji SystemD po zakończeniu.

Ok, więc utworz plik serwisowy w dokumentach. Teraz jesteśmy gotowi przejrzeć, jak napisać ten plik.
[Uwaga: patrz potencjalny raport błędu w sekcji komentarzy tego postu na blogu]

[Jednostka]
Opis = Penguins Web Application Server HTTP (działający w porcie 8080)
Wantby = Multi-User.cel
[Praca]
Typ = prosty
Execstart =/usr/bin/python3/usr/local/bin/penguin-web-app/main.py
Restart = zawsze

Format pliku jest w rzeczywistości blisko INI. Wiem, że może być dziwne, biorąc pod uwagę pliki INI często znajdują się w systemie Windows, ale tak to działa. Plik usługi jest najpierw podzielony na 2 sekcje: [Jednostka] i [Service]. Każda sekcja konfiguruje określony aspekt SystemD: [Jednostka] zawiera elementy udostępnione przez wszystkie pliki jednostki systemu, podczas gdy [usługa] jest przeznaczona tylko do konfiguracji specyficznej dla konfigurowania nowej usługi.

Następnie sekcja jest konfigurowana z właściwościami takimi jak opis = lub execStart =. Wartość jest oddzielona od nazwy właściwości znakiem równości = bez miejsca.

Wróćmy do pliku pokazanego powyżej. Opisuje usługę zaprojektowaną do uruchomienia aplikacji internetowej napisanej w Pythonie o pingwinach. SystemD ponownie go uruchomi, gdy proces wychodzi i uruchomi serwer po uruchomieniu serwera, jeśli włączysz go za pomocą polecenia SystemCtl Enable. Fajny eh?

Ale być może twoja następna aplikacja internetowa nie chodzi o pingwiny - I to wstyd - I nie jest napisane w Pythonie. W takim przypadku będziesz chciał dowiedzieć się więcej o możliwych konfiguracjach.

Właściwości usług systemowych

Najpierw skupmy się na właściwościach w [jednostce]:

Opis = polega prawie na podaniu jasnego opisu tego, co robi usługa. Jest wyświetlany na liście usług, dzienniki usług, więc chcesz, aby był opisowy, ale powinien pozostać w jednym wierszu i jednym zdaniu.

WESPABY = pozwala powiedzieć SystemD: Kiedy to się uruchomi, zaczyna mnie również. Ogólnie umieścisz nazwę celu. Przykłady wspólnych celów:

  1. Multi-użytkownik.Cel: Gdy serwer jest w porządku i jest gotowy do uruchomienia aplikacji wiersza poleceń
  2. graficzny.Cel: Gdy GNOME lub KDE są gotowe
  3. Sieć.Cel: Gdy serwer jest poprawnie podłączony do sieci

Ok na początek te właściwości [jednostki] wystarczy. Spójrzmy teraz na [serwis].

Type = pomaga systemowi, jak wiedzieć, czy usługa działa. Oto typowe typy:

  1. Proste jest prawdopodobnie najczęściej używane: SystemD rozważa proces uruchamiany jako ten wykonujący usługę. Jeśli proces się zatrzyma, rozważa to również zatrzymanie usługi, itp.
  2. Forking jest preferowany dla aplikacji, które zostały napisane jako serwer, ale bez pomocy systemu zarządzania usługami. Zasadniczo oczekuje, że uruchomiono proces widelca, a widelca jest uważany za ostateczny proces usługi. Aby być dokładniejszym, możesz również pomóc SystemD w pliku PID, w którym PID procesu do śledzenia jest napisane przez uruchomioną aplikację.

ExecStart = jest prawdopodobnie najważniejszy dla usługi: preparuje aplikację uruchomienia podczas uruchamiania usługi. Jak widać w Penguin Service, użyłem/usr/bin/python3, a nie Python3. To dlatego, że dokumentacja systemowa wyraźnie zaleca używanie bezwzględnych ścieżek, aby uniknąć jakichkolwiek niespodzianek.

Ale to również z innego powodu. System zarządzania innymi usługami opiera się na skontlerze. Jednak systemd, z powodu wydajności, domyślnie nie uruchamia powłoki. Więc nie możesz podać bezpośrednio polecenia powłoki w execStart =. Nadal możesz użyć skryptu powłoki, wykonując:

ExecStart =/usr/bin/bash/usr/local/bin/uruchamia-penguin-server.cii

Nie tak trudne, prawda? Zauważ, że jeśli musisz uruchomić jakiś proces, aby zasygnalizować usługę, aby zatrzymał się czysto, istnieje ExecStop =, a także execRoad = w celu ponownego ładowania usług.

Restart = pozwala jawnie powiedzieć, kiedy usługa powinna zostać ponownie uruchomiona. Jest to jedna z ważnych funkcji SystemD: zapewnia, że ​​Twoja usługa pozostanie tak długo, jak chcesz, więc zwróć szczególną uwagę na tę opcję.

Restart = Oznaczający
zawsze SystemD będzie go ponownie uruchamiać, gdy się kończy lub zawiedzie. Cóż, dopóki nie zrobisz SystemCtl Stop Service-Name.praca.

Jest idealny na serwery i usługi online, ponieważ wolisz niewiele bezużytecznych ponownych uruchamiania niż konieczność ręcznego ponownego uruchomienia usługi bez żadnego powodu.

Abnormal Po awarii procesu usługi uruchom ponownie usługę. Jeśli jednak aplikacja wychodzi czysto, nie uruchom go ponownie.

Jest to bardziej przydatne w przypadku cron-miejsc, takich jak usługi, które muszą niezawodnie wykonywać zadanie, ale nie muszą działać cały czas.

na tle Podobnie jak w przypadku abncji, ale ponownie uruchamia usługę, gdy aplikacja wychodzi czysto, ale z niezerowym kodem wyjściowym. Niezerowe kody wyjściowe zazwyczaj oznaczają błąd.
NIE SystemD nie uruchomi usługi automatycznie.

Ogólnie przydatne, aby uzyskać dostęp do innych funkcji systemowych, takich jak rejestrowanie bez funkcji restartu.

WorkingDirectory = może egzekwować działający katalog podczas uruchamiania aplikacji. Wartość musi być bezwzględną ścieżką katalogu. Katalog roboczy jest używany podczas korzystania z względnych ścieżek w kodzie aplikacji. Dla naszej usługi pingwinów może być:

WorkingDirectory =/srv/penguin-WEB-APP/

Następnie bezpieczeństwo jest ważne, więc generalnie nie chcesz uruchomić usługi z uprawnieniami root. User = i grupa = umożliwia ustawienie nazwy użytkownika lub grupy lub UID/GID, pod którym zostanie uruchomiona aplikacja. Na przykład:

Użytkownik = pingwina-Web
Grupa = pingwina-Web

Środowisko plik = potężna opcja. Aplikacje działające jako usługi często wymagają plików konfiguracji i środowiska pozwalają na ustawienie tej konfiguracji na dwa sposoby:

  1. Aplikacja może odczytać zmienną środowiskową.
  2. Ale możesz także ustawić różne argumenty wiersza poleceń na swojej aplikacji bez zmiany pliku serwisowego.

Składnia tego pliku jest prosta: wpisz nazwę zmiennej środowiska, znak równości =, a następnie jego wartość. Następnie umieszczasz bezwzględną ścieżkę pliku środowiska do właściwości PLIFILE.

Więc przykład:

Plik środowiska =/etc/pingwina-WEB-App/środowisko

A plik/etc/penguin-WEB-App/Environment zawiera:

Listen_port = 8080

Wtedy nasza aplikacja internetowa Penguins będzie miała dostęp do zmiennej środowiskowej Listen_Port i wysłucha oczekiwanego portu.

Zapisz i uruchom nowo utworzoną usługę SystemD

Więc jeśli postępowałeś zgodnie z moją radą, edytowałeś swój plik serwisowy w katalogu domowym. Gdy jesteś zadowolony, skopiuj ten plik do/usr/local/lib/systemd/system, zakładając, że dystrybucja obsługuje tę ścieżkę. Nazwa pliku pliku usługi będzie jego nazwa usługi. Ta nazwa pliku musi się skończyć .praca. Na przykład dla naszego serwera Penguin.praca.

Następnie musisz powiedzieć SystemD, że dodałeś nową usługę, więc musisz wpisać to polecenie:

$ sudo systemctl demon-powód

Okej, teraz systemd jest świadomy nowej usługi, zakładając, że plik nie zawiera błędu składni. W końcu jest to twój pierwszy plik, więc prawdopodobnie popełnisz błędy. Musisz uruchomić to polecenie powyżej w każdej aktualizacji w pliku usługi.

Teraz czas na rozpoczęcie usługi:

$ sudo systemctl start pingwina-web-app.praca

Jeśli zawiedzie z urządzeniem, który nie został znaleziony, taki jak ten:

$ sudo systemctl start pingwina-web-app.praca
Nie udało się uruchomić pingwina-web-app.Usługa: jednostka nie znaleziono.

Oznacza to, że Twoja dystrybucja nie obsługuje katalogu lub nie wymieniłeś poprawnie pliku serwisowego. Pamiętaj, aby sprawdzić.

Jeśli skonfigurujesz usługę z WantedBy = i chcesz, aby Twoja usługa rozpoczęła się automatycznie, musisz ją włączyć, z tym poleceniem:

$ sudo systemctl włącz pingwina-web-app.praca

Fajną rzeczą z usługą jest to, że działa ona w tle. Problem: jak wiedzieć, czy działa poprawnie i czy działa, jeśli działa w tle? Nie martw się, zespół SystemD też o tym pomyślał i dostarczył polecenie, aby sprawdzić, czy działa poprawnie, ponieważ ile czasu itp

$ SystemCtl Status Penguin-WEB-App.praca

Wniosek

gratulacje! Możesz teraz zarządzać swoimi aplikacjami bez troski o ponowne uruchomienie ich ręcznie za każdym razem. Teraz polecam przeczytanie naszego innego artykułu o dziennikach systemu: Master Journalctl: Zrozumieć dzienniki systemowe. Dzięki temu możesz użyć potężnego systemu rejestrowania nowej usługi i zbudować bardziej niezawodne serwery!