Raspberry Pi är en kraftfull SBC (single board-dator) som du kan använda för olika applikationer och projekt. Dess mångsidighet ligger i dess förmåga att köra alla typer av program, inklusive anpassade skript, delvis tack vare Raspberry Pi OS och andra Linux-baserade operativsystem som den kör.
Att köra ett skript eller program på Raspberry Pi är lika enkelt som att hitta det på systemet och köra det. Men vad händer om du vill automatisera den här processen, kanske för att ditt projekt kräver det eller för att du vill effektivisera ditt arbetsflöde?
Ett svar på detta är att lära sig hur man använder systemd.
Vad är Systemd?
systemd är en uppsättning systemkomponenter för tjänstkonfiguration och beteende på moderna Linux-system. Den identifieras med ett PID (processidentifierare) på 1 eftersom det är den första processen som startar upp vid systemstart. Systemds syfte är i stort att hjälpa dig med att hantera och köra program vid systemstart. Och det är vad du kommer att utnyttja för att starta ditt program vid start på Pi.
Som nämnts inledningsvis finns det flera metoder för att köra program vid uppstart på Linux-system, såsom rc.local, cron och autostart. Systemd råkar dock ut för en bättre lösning om du vill starta GUI-program (grafiskt användargränssnitt), automatisera applikationer att köra efter att vissa systemprocesser har börjat, eller köra program om och om igen tills din schemaläggning fungerar.
Hur man använder systemd för att starta program vid uppstart
systemd är en något mer komplicerad metod för att starta program vid uppstart på Linux-system. Men den schemaläggningsflexibilitet som den erbjuder jämfört med andra metoder – de vi har nämnt ovan – uppväger totalt dess komplexitet i alla aspekter.
Systemd-metoden använder enhetsfiler, som är ungefär som .ini-filer som innehåller kodningsinformation om enheter, tjänster, sockets, startmål och andra viktiga systemkomponenter.
Enhetsfiler är av olika typer. Så, baserat på vilken typ av resurs du vill deklarera, måste du välja en enhetsfiltyp i enlighet med detta. För syftet med den här guiden kommer vi dock att hålla oss till .service-enhetsfiler, som låter dig hantera startbeteendet för program och skript på systemet.
Nedan är en uppdelning av stegen som är involverade i att starta ett skript/program vid uppstart med systemd.
Skapa en tjänst
För att ställa in ditt program att köra vid start, skapa en serviceenhetsfil som talar om för systemd vilket program som ska köras och när. Så här gör du.
- I CLI-fönstret skriver du sudo nano /lib/systemd/system/display.service. Du kan använda vilket namn som helst för din tjänst så länge den slutar med tillägget .service. Klistra in följande kodrader i servicefilen:
[Unit]
Description=PiCounter
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Alla dina vanliga konfigurationsalternativ faller under Enhet och Installera sektioner, medan de tjänstespecifika konfigurationsalternativen går under sektionen Tjänst.
Några av ovanstående direktiv-värdepar som du kan behöva ändra inkluderar:
i. Efter: Det avgör när tjänsten ska startas. Ställer in den på nätverk.mål säkerställer att det listade värdet — network.target i detta fall — startar innan den aktuella enheten påbörjas. Det styr dock inte ett beroendeförhållande för tjänsten att utlösa; det görs genom andra direktiv som Wants, Requires och WantedBy.
Naturligtvis kan du ändra detta värde för att passa dina projektkrav. Om du till exempel vill att ditt program ska köras efter att din Raspberry Pi anslutit till ett nätverk, kan du använda nätverk-online.mål värde. Du kan referera till Fedoras dokumentation om systemd för att lära dig mer om dessa värden.
ii. ExecStart: Den innehåller den absoluta sökvägen och programmet/skriptnamnet som du vill köra vid start. Så beroende på vad du vill utföra måste du lägga till värden för båda dessa direktiv.
iii. Användare: Den identifierar namnet på din Raspberry Pi. Om du har ändrat din Pi-namn måste du ange det värdet för användare.
iv. Efterlyst av: Det är det vanligaste sättet att specificera triggern för en enhet. Genom att ställa in den på multi-user.target, kan du upprätta en beroenderelation som kommer att köra programmet när systemkontrollen överlämnas till fleranvändarskalet.
Dessutom kör detta även ditt program innan Pis X-Windows-system startar, vilket innebär att ditt program körs redan innan du loggar in på systemet. Om du vill att ett skript ska köras innan du loggar in på din Raspberry Pi, så kan du göra det.
Ovanstående kodrader fungerar för icke-GUI-program. Men om du vill köra ett GUI-program med systemd bör du lägga till följande kod till din tjänstfil:
[Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target
I ovanstående direktiv-värdepar är allt du behöver ändra värdet för ExecStart direktiv. Byt ut den i kodblocket med programmet du vill köra vid uppstart. När du har fyllt i tjänstefilen, tryck CTRL + O för att spara den.
Testa tjänsten
Med tjänsten redo, verifiera manuellt om den fungerar. För detta, skriv följande kommando i terminalen: sudo systemctl starta display.service. Tjänsten bör utföra dina instruktioner framgångsrikt.
När det gör det, avsluta det med sudo systemctl stoppa display.service.
Aktivera tjänsten
Om du lyckades köra ditt program med hjälp av tjänsten är det dags att aktivera det så att det kör ditt program automatiskt varje gång du startar upp din Raspberry Pi.
För att göra detta, skriv sudo systemctl aktivera display.service i terminalfönstret. Och när det är gjort, gå in sudo omstart för att starta om din Pi.
När din Raspberry Pi startar upp bör systemd köra ditt program enligt dina instruktioner.
Automatisera programstart vid start på Raspberry Pi
Som de flesta Linux-system låter Raspberry Pi OS dig också utföra operationer på flera sätt, och det förblir sant att schemalägga programstarter också. Så om du vill starta GUI-program/skript vid start och vill ha bättre kontroll över din schemaläggning är systemd helt klart en bättre metod.
Men som sagt, om du vill ha en enklare lösning eller om dina projektkrav kräver specifik schemaläggning, kan du läsa vår guide till att köra ett Raspberry Pi-program eller -skript vid start för att lära dig mer.
Om författaren
Yash Wate (40 publicerade artiklar)
Yash är en personalskribent på MUO för gör-det-själv, Linux, programmering och säkerhet. Innan han hittade sin passion för att skriva brukade han utveckla för webben och iOS. Du kan också hitta hans författarskap på TechPP, där han täcker andra vertikaler. Förutom teknik tycker han om att prata om astronomi, Formel 1 och klockor.
Mer från Yash Wate
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
