Auto-uruchamianie programów na Raspberry Pi

Czas czytania: 3 min.

Raspberry Pi – autostart i ponowne uruchamianie

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 zapewni RPI autostart. 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. Autostart Raspberry to sposób na łatwy i szybki reset programu, który nie spowoduje utraty danych czy zamknięcia programu. Z kolei Raspberry Pi autorun to możliwość automatycznego rozpoczęcia działania programu wraz ze startem systemu, co pozwala na optymalizację czasu, którego już nie trzeba przeznaczać na manualne otwieranie każdej aplikacji z osobna.

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!

Jakie dodatkowe programy na Raspberry Pi warto zainstalować?

  • Iceweasel (Firefox) – Przeglądarka
  • Chromium (Chrome) – Przeglądarka
  • Midori – Przeglądarka
  • LibreOffice – Pakiet biurowy
  • Inkscape – Program graficzny
  • GIMP – Program graficzny
  • Pinta – Program graficzny
  • scrot – Zrzut ekranu
  • mc – Midnight Commander – zarządzanie plikami
  • 7zip – Kompresja danych
  • Gparted – Program do zarządzania partycjami

Podstawowe komendy Raspberry Pi

Poznaj najpotrzebniejsze komendy na Raspberry Pi, dzięki którym Twoje urządzenie będzie działało jeszcze sprawniej. Są to między innym takie polecenia, jaki:

  • df / -h – ilość miejsca na dysku dostępną na karcie SD
  • free -h – informacje o użyciu pamięci
  • date – aktualny czas
  • sudo su – użytkownik root
  • sudo raspi-config – uruchomienie programu Raspi-config, który umożliwia rekonfigurację systemu.
  • sudo reboot – ponowne uruchomienie RPI
  • sudo shutdown -h now – przygotowanie do wyłączenia
  • exit – wylogowuje z bieżącej powłoki systemowej/sesji SSH

Jak zacząć więc przygodę z RPI? Aby umożliwić Raspberry Pi start, należy wgrać system operacyjny na USB lub kartę SD. Nie trzeba robić tego manualnie, bo powstały specjalne programy, które zrobią to za nas. Dodatkowo uprzednio sformatują one kartę, tak aby nic się na niej nie znajdowało. Nie jest to zaawansowana procedura, dlatego z pewnością poradzi z nią sobie nawet amator. Powodzenia!

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

Jak oceniasz ten wpis blogowy?

Kliknij gwiazdkę, aby go ocenić!

Średnia ocena: 4.8 / 5. Liczba głosów: 6

Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.

Podziel się:

Picture of Maciej Chmiel

Maciej Chmiel

Specjalista od Arduino i szeroko rozumianej elektroniki. Człowiek-orkiestra, dyżurny od wszystkiego - nie ma dla niego rzeczy niemożliwych, a czas ich realizacji jest zwykle prawie natychmiastowy. Po pracy miłośnik kreskówek z Pepe Panem Dziobakiem. Jego bezcenne memy wspomagają dział kreatywny.

Zobacz więcej:

Masz pytanie techniczne?
Napisz komentarz lub zapytaj na zaprzyjaźnionym forum o elektronice.

3 Responses

  1. 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.

  2. “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…

  3. 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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Ze względów bezpieczeństwa wymagane jest korzystanie z usługi Google reCAPTCHA, która podlega Polityce prywatności i Warunkom użytkowania.