Service – autostart i kontrola nad procesami działającymi w tle za pomocą serwisów

Service - autostart i kontrola nad procesami działającymi w tle Linux'a, za pomocą serwisów

Poziom trudności
2/5

Chcąc kontrolować programy lub skrypty, które mają działać w tle i (lub) automatycznie uruchamiać się po restarcie urządzenia, polecam skorzystać z serwisów. Jest to bardzo przydatne w przypadku gdy tworzymy usługi, które mają nasłuchiwać jakiś konkretnych akcji lub stanu naszego urządzenia albo tylko czekać w gotowości na naszą reakcję z nimi związaną. Dzięki serwisom mamy stały dostęp do statusu naszej aplikacji i możemy w każdej chwili ją zatrzymać lub zrestartować.

Stwórz własny serwis

Do stworzenia własnego serwisu potrzebujesz:
– 1 aplikację, program lub skrypt
– 1 plik konfigurujący serwis
I w sumie to cała filozofia. Plik umieścimy w katalogu /etc/systemd/system/

pi@raspberrypi:~ $ cd /etc/systemd/system/

Nazwa pliku powinna składać się z nadanej przez nas nazwy i informacji o tym, że jest serwis: {nasza_nazwa}.service. W moim przypadku będzie to konfiguracja do serwisu obsługującego popularny program Flask (my_flask.service). Przedstawiam przykładową zawartość pliku konfiguracyjnego:

[Unit]
Description=flask aplication
After=multi-user.target
[Service]
Type=idle
User=root
ExecStart=/usr/bin/python3.5 /home/root/flask/app.py
Restart=always
RestartSec=0
[Install]
WantedBy=multi-user.target

Na razie będzie nam potrzebne odpowiednie wypełnienie pól ExecStart i User. W pierwszym umieszczamy informację czym i co uruchamiamy – u mnie jest to podanie ścieżki do Pythona w wersji 3.5.3, a następnie, po spacji, ścieżka do pliku, który ma być nim uruchomiony. Pole User wybierz użytkownika, jaki ma uruchamiać te aplikację – najbezpieczniej jest podawać właściciela (owner‚a) uruchamianego pliku. W powyższym przykładzie właścicielem pliku app.py jest root.

Po więcej informacji na temat konfiguracji serwisu odsyłam bezpośrednio do instrukcji obsługi:

pi@raspberrypi:~ $ man systemd.service

Wystartuj, zatrzymaj, zrestartuj

Do wystartowania serwisu wykorzystamy komendy systemctl. Obsługa serwisów jest dostępna jedynie z poziomu root’a, dlatego możemy w tym momencie użyć tego użytkownika lub (jeżeli nasz Linux ma taką funkcję) sudo:

pi@raspberrypi:~ $ sudo systemctl start my_flask.service

Jak widać na powyższym przykładzie, bezpośrednio po komendzie systemctl wpisujemy argument start i nazwę serwisu. Aby sprawdzić czy nasz program działa poprawnie, zamiast argumentu start (komendy systemctl) użyj argumentu status:

pi@raspberrypi:~ $ sudo systemctl status my_flask.service
- my_flask.service - flask application
Loaded: loaded (/etc/systemd/system/my_flask.service; enabled; vendor preset
Active: active (running) since Wed 2019-11-20 20:48:40 GMT; 55min ago
Main PID: 22687 (python3.5)
CGroup: /system.slice/my_flask.service
/usr/bin/python3.5 /home/root/flask/app.py

W linijce czwartej widzimy, że serwis jest aktywny i w ciągłym działaniu. Czyli dokładnie to, czego oczekiwaliśmy po jego wystartowaniu. Działający program również jest również widoczny w liście procesów, którą możemy zobaczyć używając komendy ps.Aby zatrzymać serwis, wystarczy użyć komendy systemctl z argumentem stop:

pi@raspberrypi:~ $ sudo systemctl stop my_flask.service
pi@raspberrypi:~ $ sudo systemctl status my_flask.service
- my_flask.service – flask application
Loaded: loaded (/etc/systemd/system/my_flask.service; enabled; vendor preset
Active: inactive (dead) since Wed 2019-11-20 21:49:18 GMT; 3s ago
Process: 22687 ExecStart=/usr/bin/python3.5 /home/root/flask/app.py (code=kille
Main PID: 22687 (code=killed, signal=TERM)

Gdy wyświetlimy status, po zatrzymaniu procesu, to w piątej linijce widzimy, że serwis jest nieaktywny. Możemy go przywrócić na dwa sposoby albo za pomocą argumentu start, albo restart. Restartu możemy używać w dowolnym stanie serwisu, spowoduje on ponowne jego uruchomienie:

pi@raspberrypi:~ $ sudo systemctl restart my_flask.service

Uruchom przy starcie urządzenia

Do tego, aby nasz serwis uruchamiał się automatycznie po uruchomieniu systemu, wystarczy użyć komendy systemctl z argumentem enable:

<pre style=”font-family:monospace; color:#F2F2F2; background:#000000″><div style=”font: normal 1em/1.2em monospace; margin:0;”>pi@raspberrypi:~ $ sudo systemctl enable app-flask.service</div></pre>

Aby wyłączyć tę opcję, użyj argumentu disable:

pi@raspberrypi:~ $ sudo systemctl disable app-flask.service

Teraz możesz w prosty sposób włączać w tle dowolne programy i je kontrolować za pomocą serwisów, nie martwiąc się o to, że coś może umknąć twojej uwadze, czy nie uruchomić ponownie przy nieoczekiwanym (lub oczekiwanym) restarcie systemu.

Dodaj komentarz