Jak uruchomić program dla Linuksa przy starcie z systemd

Chcesz uruchomić program Linux podczas rozruchu? Oprogramowanie systemd umożliwia zrobienie tego w dowolnej dystrybucji Linuksa z systememd – czyli w większości z nich obecnie, w tym w Ubuntu. Przeprowadzimy Cię przez proces tworzenia zintegrowanej usługi – a nawet porozmawia z dziennikiem.

W tym samouczku pokazano, jak skonfigurować usługę systemową, która jest uruchamiana po uruchomieniu systemu. Aby uruchomić program graficzny po zalogowaniu, użyj zamiast tego menedżera uruchamiania pulpitu.

Uruchamianie programów podczas uruchamiania

Czasami oprogramowanie instalowane na komputerze podłącza się do procesu uruchamiania Linuksa, tak że program jest automatycznie uruchamiany przy każdym uruchomieniu komputera. Możesz łatwo osiągnąć to samo zachowanie za pomocą własnych programów i skryptów lub w rzeczywistości dowolnego innego programu na komputerze.

Programy uruchamiane podczas uruchamiania są kontrolowane przez systemd, plik system i serwis menedżer. systemd to pierwszy proces uruchamiany podczas uruchamiania. Zawsze tak było identyfikator procesu (PID) 1. Każdy inny proces uruchomiony na komputerze jest uruchamiany przez systemd lub przez proces, który już został uruchomiony przez systemd.

Programy działające w tle są nazywane demony lub usług. Litera „d” na końcu systemd oznacza daemon. W tym artykule utworzymy przykładową usługę. Aby zaznaczyć wszystkie pola, nasza usługa musi być:

Zintegrowany z systemd poprzez plik jednostki usługowej
Uruchomiony przy starcie
Sterowane za pomocą systemctl, interfejs sterowania dla systemd
Potrafi pisać do dziennika

Tworzenie programu serwisowego

Musimy mieć program, który uruchomi systemd. Stworzymy prosty skrypt o nazwie „htg.sh”. Ten samouczek używa edytora tekstu Gedit, ale możesz użyć dowolnego preferowanego edytora tekstu.

touch htg.sh
gedit htg.sh

dotknij htg.sh w oknie terminala

Otworzy się edytor gedit. Skopiuj i wklej następujący tekst do edytora.

#!/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

Zapisz zmiany i zamknij edytor.

htg.sh w edytorze gedit

Skrypt nie robi zbyt wiele, ale jest kilka punktów wartych odnotowania.

Dwie linie echa są przesyłane potokiem przez systemd-cat, program, który pobiera plik wyjście z programu i przesyła je do dziennika. Wpisy do czasopisma mają priorytet. Używamy opcji -p (priorytet), aby wskazać, że nasze wiadomości służą wyłącznie do celów informacyjnych (info). Nie są to ważne błędy ani ostrzeżenia.
Istnieje nieskończona pętla while.
Zmienna TIMESTAMP jest ustawiana na bieżącą datę i godzinę. Jest to formatowane w wiadomość i wysyłane do dziennika.
Następnie skrypt zasypia przez 60 sekund.
Po 60 sekundach pętla się powtarza. Tak więc ten skrypt raz na minutę zapisuje w dzienniku wiadomość ze znacznikiem czasu.

Skopiujemy skrypt do katalogu / usr / local / bin.

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin w oknie terminala

I musimy sprawić, by był wykonywalny:

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

sudo chmod + x /usr/local/bin/htg.sh w oknie terminala

Tworzenie pliku jednostki usługowej

Każdy program uruchamiany przez systemd ma plik definicji, nazywany plikiem jednostki usługowej. Zawiera pewne atrybuty, których systemd może użyć do zlokalizowania i uruchomienia programu oraz do zdefiniowania niektórych jego zachowań.

Musimy utworzyć plik jednostek dla naszej nowej usługi, ale rozsądnie jest upewnić się, że żaden z istniejących plików jednostek nie ma nazwy, którą chcemy nadać naszej nowej usłudze.

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

sudo systemctl list-unit-files --type-service w oknie terminala

Możesz przewijać listę plików jednostkowych, która jest posortowana alfabetycznie i sprawdzić, czy nazwa, której chcesz użyć, nie jest zajęta.

Lista plików jednostek systemowych w oknie terminala

Nasza usługa będzie się nazywać „htg.service”. Żadne pliki jednostek nie mają tej nazwy, więc możemy kontynuować i utworzyć nasz plik jednostkowy.

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

sudo gedit /etc/systemd/system/htg.service w oknie terminala

Otworzy się edytor gedit. Skopiuj i wklej następujący tekst do edytora:

[Unit]
Description=newsblog.pl 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

Zapisz zmiany i zamknij edytor.

htg.service unit w edytorze gedit

Wpisy mają takie znaczenie. To są typowe wpisy. Nasza prosta usługa nie potrzebuje większości z nich, ale uwzględnienie ich pozwala nam je wyjaśnić.

Opis: to jest tekstowy opis Twojej usługi.
Chce: nasza usługa chce – ale nie wymaga – działania sieci przed uruchomieniem usługi.
Po: lista nazw jednostek, które powinny zostać uruchomione po pomyślnym uruchomieniu tej usługi, jeśli nie są jeszcze uruchomione.
Typ: prosty. systemd uzna tę usługę za uruchomioną, gdy tylko proces określony przez ExecStart zostanie rozwidlony.
ExecStart: ścieżka do procesu, który powinien zostać uruchomiony.
Uruchom ponownie: kiedy i czy usługa powinna zostać ponownie uruchomiona. Ustawiliśmy to na „w przypadku awarii”.
RestartSec: czas oczekiwania przed próbą ponownego uruchomienia usługi. Ta wartość jest w sekundach.
KillMode: określa, w jaki sposób systemd powinien zabić proces, jeśli poprosimy systemctl o zatrzymanie usługi. Mamy to ustawione na „przetwarzanie”. Powoduje to, że systemd używa sygnału SIGTERM tylko w procesie głównym. Gdyby nasza usługa była nietrywialnym programem zamiast prostego skryptu, ustawilibyśmy to na „mieszane”, aby upewnić się, że wszystkie uruchomione procesy również zostały zakończone.
WantedBy: Mamy to ustawione na „multi-user.target”, co oznacza, że ​​usługa powinna zostać uruchomiona, o ile system jest w stanie, w którym może się zalogować wielu użytkowników, niezależnie od tego, czy dostępny jest graficzny interfejs użytkownika.

Plik jednostkowy nie musi być wykonywalny, ale uprawnienia do pliku jednostkowego powinny ograniczać, kto może go edytować. Nie chcesz, aby złośliwy lub złośliwy użytkownik zmienił plik jednostki, tak aby wykonywał zupełnie inny program.

To polecenie nada właścicielowi uprawnienia do odczytu i zapisu oraz uprawnienia do odczytu grupy. Inni nie będą mieli uprawnień.

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

sudo chmod 640 /etc/systemd/system/htg.service w oknie terminala

Możemy poprosić systemctl o sprawdzenie składni naszego pliku jednostkowego, nawet jeśli usługa nie jest jeszcze uruchomiona. Wszelkie błędy zostaną zgłoszone. (W rzeczywistości część „.service” jest opcjonalna dla większości poleceń).

systemctl status htg.service

status systemctl htg.service w oknie terminala

Nie są podświetlone żadne błędy, co oznacza, że ​​nasz plik jednostki jest poprawny pod względem składniowym.

Uruchomienie usługi

Kiedy dodajesz nowy plik jednostek lub edytujesz istniejący, musisz powiedzieć systemd, aby ponownie załadował definicje plików jednostek.

sudo systemctl daemon-reload

Jeśli chcesz, aby usługa była uruchamiana przy starcie, musisz ją włączyć:

sudo systemctl enable htg

Włączenie usługi nie powoduje jej uruchomienia, a jedynie powoduje jej uruchomienie podczas rozruchu. Aby uruchomić usługę teraz, musisz użyć systemctl z opcją start.

sudo systemctl start htg

sudo systemctl daemon-reload w oknie terminala

Weryfikacja usługi

Po ręcznym uruchomieniu usługi lub po ponownym uruchomieniu komputera możemy zweryfikować, czy nasza usługa działa poprawnie.

sudo systemctl status htg.service

sudo systemctl status htg.service w oknie terminala

Status usługi jest wyświetlany dla nas.

Stan usługi htg.service w oknie terminala

Zielona kropka oznacza, że ​​nasza usługa działa sprawnie.
Nazwa usługi to „htg.service”, a długi opis to ten, który podaliśmy w pliku jednostkowym.
Pokazano nam, który plik jednostki został załadowany „/etc/systemd/system/htg.service”.
Usługa jest aktywna, a czas jej uruchomienia jest widoczny dla nas.
Jego PID to 7762.
Z usługą są powiązane dwa zadania.
Łącznie 928 Kibibajty pamięci są używane przez usługę.
Grupa kontrolna zawiera skrypt „htg.sh” i polecenie uśpienia, które zostało uruchomione przez „htg.sh”. W większości przypadków polecenie uśpienia będzie wykonywać pracę dla tej usługi.

Pokazano również 10 ostatnich wpisów do dziennika utworzonych przez tę usługę. Nic dziwnego, że są one oddalone od siebie o minutę.

Zatrzymywanie i wyłączanie usługi

Jeśli chcesz zatrzymać usługę, możesz to zrobić za pomocą tego polecenia:

sudo systemctl stop htg.service

sudo systemctl zatrzymuje htg.service w oknie terminala

Spowoduje to zatrzymanie usługi, ale nie uniemożliwi jej ponownego uruchomienia przy następnym ponownym uruchomieniu komputera. Aby zatrzymać uruchamianie usługi podczas uruchamiania, musisz ją wyłączyć:

sudo systemctl disable htg.service

sudo systemtctl wyłącz htg.service w oknie terminala

Jeśli usługa jest uruchomiona, to polecenie nie zatrzymuje jej. Po prostu informuje systemd, aby nie uruchamiał usługi przy następnym uruchomieniu.

Jeśli chcesz zatrzymać usługę i uniemożliwić jej uruchomienie podczas uruchamiania, użyj obu poleceń.

Wskazówka dotycząca serwisu

Upewnij się, że program działa zgodnie z oczekiwaniami, zanim spróbujesz uruchomić go jako usługę.