Auto-uruchamianie programów na Raspberry Pi

Istnieje wiele sposobów na auto-uruchamianie programów podczas ładowania systemu lub logowania się. Między innymi ‘cron’, ‘init’, Gnome Scheduler, jednak w najnowszej wersji Raspbian dodano nową, o nazwie ‘systemd’.

systemd

Jest to w rzeczywistości pakiet aplikacji używanych do zarządzania systemem operacyjnym. W tej funkcji można skonfigurować ‘service’ (program), którym systemd będzie automatycznie zarządzał. Więc jeżeli np. program przestanie odpowiadać, systemd automatycznie go zrestartuje. Funkcja ta jest szczególnie przydatna, jeśli Raspberry Pi jest używane do monitorowania czegoś lub do rejestrowania pomiarów i nie chcesz niczego przeoczyć lub używasz robota opartego na Raspberry Pi, a awaria programu sterującego oznaczałaby utratę kontroli.

Konfiguracja

W tym przykładzie uruchomimy skrypt napisany w pythonie uruchamiany za każdym razem podczas startu systemu w Raspberry Pi. Ten skrypt służy do sterowania robotem, który nie ma wejścia na ekran, czy klawiaturę, więc uruchomienie programu przy starcie systemu jest niezbędne. Umieściłem skrypt w katalogu domowym użytkowników ‘pi’:

/home/pi/DriveRobot.py

systemd używa plików konfiguracyjnych zwanych ‘unit’, aby powiedzieć im co mają robić. Stwórzmy jeden dla naszego robota. Otwórz okno terminala i wpisz następujące komendy:

sudo nano /lib/systemd/system/driverobot.service

Teraz wpisz to:

[Unit]
Description=DriveRobot Service
After=multi-user.target

[Service]
Type=idle

User=pi
ExecStart=/usr/bin/python3 /home/pi/DriveRobot.py

Restart=always
RestartSec=0

[Install]
WantedBy=multi-user.target

W tym pliku unit znajdują się 3 sekcje:

  • Sekcja [Unit] zawiera dwie wartości:
    • nazwę wartości usługi („Description”)
    • Kiedy system się ładuje, usługa powinna wystartować (‘After’). W tym przypadku będzie ona uruchamiana po zakończeniu procesu systemd ‘multi-user’, tj. na etapie, w którym konta użytkowników są dostępne w systemie. To jest przed załadowaniem Raspbian Desktop, więc jeżeli twoje Raspberry ładuje się w trybie Desktop i chcesz żeby twój program ładował się w interfejsie użytkownika na pulpicie, musisz zmienić to na „graphical.target”.
  • Sekcja [Service] konfiguruje to co będzie uruchamiane i co ma zrobić jeżeli program przestanie odpowiadać lub się wyłączy.
    • Opcja ‘Type’ i ‘idle’ mówią systemd, żeby czekał aż wszystkie inne usługi zostaną wykonane. Nie spowalnia to rozruchu systemu.
    • ‘User’ definiuje, którego użytkownika program będzie działał. W tym przypadku, standardowo użytkownik ‘pi’.
    • ‘ExecStart’ jest plikiem wykonywalnym. W tym przypadku python3 uruchamia skrypt DriverRobot.py. Zwróć uwagę na to, że musisz podać pełną ścieżkę programu, który uruchamiasz (python3) oraz skryptu.
    • ‘Restart’ ustawione na ‘always’ mówi systemd, żeby monitorował proces startu i jeżeli się wyłączy, zresetował go.
    • ‘RestartSec’ mówi systemd, żeby zaczekał 0 sekund przed restartem programów, jeżeli się wyłączy.
  • Finalna sekcja [Install] posiada dyrektywę ‘WantedBy’. Oznacza to, że usługa driverobot będzie luźno powiązana z usługą dla wielu użytkowników – zostanie uruchomiona po pomyślnym uruchomieniu usług wielu użytkowników.

Po zapisaniu należy zmienić uprawnienia pliku:

sudo chmod 644 /lib/systemd/system/driverobot.service

Co sprawi, że będzie mogła być odczytana przez wszystkich, ale zapisywana tylko przez właściciela.

Konfigurowanie systemd

Po utworzeniu pliku należy poinformować o tym systemd i uruchomić go, aby usługa driverobot była uruchamiana za każdym razem podczas uruchamiania Raspberry Pi. Wprowadź poniższe instrukcje:

sudo systemctl daemon-reload
sudo systemctl enable driverobot.service

Następnie uruchom ponownie Raspberry Pi.

Sprawdzanie statusu usługi driverobot

Kiedy Raspberry Pi uruchomi się ponownie, twój skrypt się uruchomi. Możesz to sprawdzić używając komendy systemctl:

sudo systemctl status driverobot.service

Powinna ona zwrócić coś takiego:

systemctl status

Testowanie ‘Crash’

Warto sprawdzić czy systemd będzie obsługiwał awarię kodu. Do zasymulowania tego należy wyłączyć (‘kill’) proces pythona, który uruchamia twój skrypt. Aby znaleźć identyfikator procesu, uruchom to:

ps -ax | grep driverobot

Komenda powinna zwrócić dwie linijki – jedna dla procesu python3 i jedna ‘grep’, którą właśnie uruchomiłeś. Identyfikatorem (pid) procesu jest pierwsza cyfra w linii.

Obtaining the Process identity (pid)
Do zatrzymania twojego kodu, wpisz:
kill -9 xxx

Gdzie xxx to identyfikator procesu, który właśnie znalazłeś.

Teraz sprawdź czy twój program został zrestartowany, uruchamiając ponownie:
ps -ax | grep driverobot

Checking the service has restarted

Jeśli systemd wykonuje swoje zadanie poprawnie, powinieneś zobaczyć wciąż działający proces python3, ale tym razem z innym identyfikatorem procesu.

Teraz możesz uruchamiać swój kod lub dowolny program za każdym razem, podczas uruchamiania Rasberry Pi, i pozostawić go uruchomionym przez cały czas!

Źródło: https://thepihut.com/blogs/raspberry-pi-tutorials/auto-starting-programs-on-the-raspberry-pi

3 Komentarze

  • Szukam, instrukcji do automatycznego wyświetlania strony internetowej szkoły w fullscreen zaraz po uruchomieniu.
    Dodam, że urządzenie to rpi3 plus telewizor podłączony przez hdmi.

  • „Komenda powinna zwrócić dwie linijki – jedna dla procesu python3 i jedna ‘grep’, którą właśnie uruchomiłeś. Identyfikatorem (pid) procesu jest pierwsza cyfra w linii.”

    Tu chodzi raczej o liczbę. Małe szanse, żeby to faktycznie była cyfra…

  • Witam wszystkich,
    mam pewien problem z usługą wykonywaną poprzez systemd. Mam kod programu który łączy się poprzez bluetoothctl dalej menu-gatt i bluez z danym urządzeniem. Program uruchamiany bezpośrednio z terminala działa jak należy niestety jako .service już nie. Polecenie „sudo systemctl restart sterowanie.service
    ” rozwiązuje problem lecz nie wiem jak dodać aby ta usługa restartowała się po każdym nowym uruchomieniu. Czy ktoś jest w stanie mi pomóc?
    Pozdrawiam

Dodaj komentarz