Home > Einsteiger > Raspberry Pi – Autostart von Skripten und Programmen einrichten

Raspberry Pi – Autostart von Skripten und Programmen einrichten

Da ich oft in meinen Tutorials auf die einzelnen Methoden zum automatischen Starten von Scripten und Anwendungen nach einem Reboot des Raspberry Pi eingegangen bin möchte ich heute die verschiedenen Autostart-Methoden nochmal zusammenfassen und in den FAQs veröffentlichen. Es gibt fünf gängige Methoden um Programme, Dienste und Scripte beim Booten des Raspberry Pi automatisch starten zu lassen.

Die Auswahl der für euch geeigneten Methode richtet sich danach zu welchem Zeitpunkt der automatische Start durchgeführt werden soll, bei den Methoden gibt es Unterschiede wann das hinterlegte Programm / Script ausgeführt wird.

  • Die in /etc/rc.local hinterlegten “Autostarts” werden am Ende des Startvorganges eures Raspberry Pi ausgeführt
  • Init Scripte liegen unter /etc/rc*/ und werden beim Startvorgang abhängig vom eingestellten Runlevel gestartet
  • .Desktop Dateien liegen im Home eines jeweiligen Benutzers und werden bei nach der Anmeldung am grafischen Desktop ausgeführt
  • .bashrc Dateien liegen ebenfalls im Home eines Benutzers und werden beim jedem Anmelden via SSH oder Konsole ausgeführt

Für einfache Skripte und Befehle eignet sich die Datei rc.local, da hier weder auf Abhängigkeiten (zum Beispiel zum Netzwerk) noch sonstiges geachtet werden muss. Die Verwendung von Init Scripten wird meist für komplexere Software und Dienste verwendet und die “sauberste” Lösung, allerdings auch etwas kompliziert. Die Autostart Methode via .desktop oder .bashrc verwendet man üblicherweise nur wenn eine Script oder Programm nur ausgeführt werden soll wenn sich ein bestimmter Benutzer anmeldet.

Wichtig ist, falls ihr Scripte via Autostart aufruft, das diese auch das Recht haben ausgeführt zu werden (chmod +x MeinScript.sh).

Init-Script Autostart

Init-Scripts werden abhängig vom Runlevel ausgeführt. Für den Startvorgang eines  Linux Systems wird das init-Programm verwendet, es ist für die ordnungsgemäße Initialisierung des Systems verantwortlich. Beim Start des Systems werden verschiedene “Runlevel” durchlaufen. Die Runlevel sind vergleichbar mit der Gangschaltung eines Autos. Man schaltet beim “starten” nacheinander die Gänge hoch, zum “stoppen” schaltet man wieder runter. Details zu den Runleven gibt zum Beispiel im Ubuntu Wiki.

Ein Init Script wird im Verzeichnis /etc/init.d/ angelegt und hat Methoden für start, stop, restart oder auch status eingetragen, Vorteil ist das ein Programm nicht nur beim booten des RasPi gestartet wird sondern beim runterfahren oder neustarten auch entsprechend behandelt wird. Im laufenden Betrieb ist mit “status” jeder Zeit der aktuelle Zustand abfragbar.

In diesem Beispiel erstellen wir ein Init Script mit dem namen “Mein Programm”. Ein umfangreicheres beispielt gibt es auf eurem RasPi unter “/etc/init.d/skeleton”.

Der Inhalt sieht wie folgt aus, gespeichert wird mit STRG+X, Y und ENTER.

Nun fügen wir das Init-Script hinzu und setzen noch die richtigen Dateirechte.

Zum entfernen wird folgender Befehl verwendet (sudo update-rc.d -f MeinProgramm  remove).

Autostart mit rc.local

Möchte man eigene Dienste, eigene Skripte oder Programme beim Systemstart automatisch starten kann man diese in die Datei /etc/rc.local eintragen. Hierbei muss sudo nicht verwendet werden, Einträge in dieser Datei werden immer mit Root Rechten ausgeführt, rc.local startet Dienste und Scripte nur außerhalb der grafischen Oberfläche automatisch.

Die Datei rc.local kann zum Beispiel mit dem Editor Nano bearbeitet werden,

Hier ein paar Beispiele, am Ende der Datei muss immer exit 0 stehen, eure Einträge müssen daher davor gesetzt werden.

LXDE Autostarts

Raspbian kann wahlweise auf eine Kommandozeile oder direkt in die grafische Oberfläche booten, die Einstellung kann via raspi-config verändert werden. Der Standard Desktop bei Raspbian ist LXDE (Lightweight X11 Desktop Environment). Auch beim Starten bzw. Anmelden eines Benutzers am Desktop können Autostarts ausgeführt werden, beim Desktop hat man hierbei die Wahl das für einen einzelnen Benutzer oder für alle Benutzer auf dem System zu konfigurieren. Die Dateien sind jeweils in den folgenden Pfaden zu finden und können mit nano editiert werden

  • Für alle Benutzer: /etc/xdg/lxsession/LXDE-pi/autostart
  • Für einen bestimmten Benutzer: ~/.config/lxsession/LXDE/autostart

Hier ein paar Beispiele für Autostarts: Ein Shell Script, der Browser Midori und ein Python Script

Jede Zeile enthält ein Kommando das ausgeführt wird, wenn einem Befehl mit einem @ beginnt, wird dieser Befehl automatisch erneut ausgeführt wenn das Programm crashed.

Autostarts mit .desktop Dateien

Eine gängige Methode automatische Starts von Programmen für einen Benutzer einzurichten ist die Verwendung von .desktop Dateien. Diese befinden sich im Home Verzeichnis des jeweiligen Benutzers und können ebenfalls mit einem Editor angelegt werden. Der Dateiname kann beliebig sein die Endung .desktop muss aber vorhanden sein.

Eine Desktop-Datei hat folgendes Format:

Mit dem Parameter Terminal true/false kann das Terminal-Fenster deaktiviert werden sodass dieses nicht angezeigt wird.

Cronjob für Autostarts

Cron bietet einen speziellen Job Typ für Aufgaben die direkt nach einen (neu)start eures Raspberry Pi ausgeführt werden sollen. Cronjobs könnt ihr entweder für euren Benutzer oder Systemweit anlegen. Zur Anlage eines Systemweiten Jobs muss dieser in /etc/crontab eingetragen werden, zum Erstellen eines Benutzer-Jobs reicht es contab -e aufzurufen.

Ein Beispiel zum Ausführen eines Scripts:

Das vorangestellte @reboot definiert das dieser Befehl nach jedem (neu)start einmal automatisch ausgeführt wird.

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (8 votes, durchschnittlich: 5,00 von 5)
Loading...

Über raspberry.tips

8 Kommentare

  1. Hallo,

    ich möchte per Cronjob (crontab -e) nach reboot 2 python Programme starten und habe dafür folgenden Eintrag gemacht:

    @reboot python /home/pi/programm1.py
    @reboot python /home/pi/prgroamm2.py

    Wenn man den Raspi nun rebootet, wird immer nur eines der beiden Programme tatsächlich gestartet.

    Daher habe ich dann zum Test den Start beider Programme in einer Skript-Datei namens start zusammengefasst.

    Wenn ich diese zum Test manuell starte: $ ./start

    werden beide Python Programme gestartet und laufen.

    Wenn ich die Crontab (crontab -e) dann ändere:

    @reboot /home/pi/start

    wird WIEDER nur eines der beiden Programme gestartet (obwohl bei manuellem Aufruf des start Skriptes immer beide Programme gestartet werden).

    Ich denke drüber nach, ob es evtl. ein Problem ist, wenn 2 Programme mehr oder weniger zeitgleich versuchen, den Python Interpreter hochzuladen? Oder weiss jemand eine andere Erklärung für dieses Phänomen?

    Gruss
    Peter

    • UND PROBLEM SCHON SELBST GEFUNDEN. Hilft manchmal, einfach drüber zu schreiben…

      Also: Schuld ist in der Tat der doppelte zeitgleiche Aufruf von Python selbst.

      Wie macht man es natürlich besser?
      1.) Alle Python Programme als “ausführbar” chmod -x programm.py definieren,
      2.) Schön drauf achten, dass in jedem Programmtext in der ersten Zeile #!/usr/bin/env python steht,
      3.) Programm nicht mehr mit python programm1.py starten, sondern mit ./programm1.py bzw. aus der crontab mit /home/pi/programm1.py starten.

      und schon laufen alle angesprochenen Python Programme!

      Gruss
      Peter

  2. Hallo,
    ich habe leider Probleme mit dem Autostart. Ich nutzte einen Raspi II als Videoausgabeeinheit um einen Fernseher/Beamer anzusteuern. Wenn ich die Befehle händig am LX Terminal eingebe funktioniert alles prima. Hab vor einiger Zeit die Bildschrimabschaltung durch Einträge in der LXDE-pi Autostart Datei deaktiviert was prima funktioniert.
    Nun wollte ich in derselben Datei einen Autostart für mein BeamerView Prog eintragen, welches aber nicht startet. Zur Info: BeamerView läuft mit Java und erhält das Video über LAN.
    Hier mal die Befehle die ich am LX Terminal eingebe:
    1. cd /home/pi/BeamerView
    Nach Wechsel in den Ordner BeamerView:
    2. java –classpath:lib/log4j-1.2.8:lib/forms:jar:lib/jcommon-1.0.15.jar:lib/jgoodies-common-1.2.1.jar BeamerView ressources.txt
    Danach läuft das Anzeigeprog.

    In die LXDE-pi Autostart Datei habe ich folgende Befehle eingetragen:

    @lxterminal
    @cd /home/pi/BeamerView
    @java –classpath:lib/ u.s.w. wie oben

    Leider startet das Prog nicht. LXTerminal ist zwar geöffnet und händig kann ich obige Befehle wieder eingeben und dann läuft auch das Prog. Was muss ich ändern damit es sofort ab Start automatisch funktioniert?
    Schon mal vielen Dank für die Unterstützung.

    Gruß
    Claus

  3. Hallo,

    ich nutze die rc.local methode zum start zweier c-Programme.
    Das funktioniert auch, solange ich im programm keine 433Utils benutze.
    Ich verwende die 433Utils um 433 MHZ Signale zu empfangen.
    Die Prozesse sind da und werden angezeigt.
    Es werden jedoch keine Signale empfangen.
    Sobald ich die rc.local von einem Terminal aus starte funktioniert alles tadellos.
    Der Unterschied beim ps Befehl ist die eine fehlende pts Angabe.
    rc.local:
    sudo /hiome/pi/start.sh &
    start.sh:
    sudo /home/pi/programm1 &
    sudo /hiome/pi/programm2 &

    Kann jemand helfen?
    Versuche mit crontab, der Aufruf mit screen, mit lxterminal führten auch nciht zum Erfolg.
    Es sieht aus, als wäre die Beutzeranmeldung erforderlich.

    Grüße

    Stefan

  4. Karl Obermeier

    Guten Tag,

    habe alle Varianten durchprobiert unter Raspbian Jessie für Raspberry Pi 3 Mobel b.
    Keine hat funktioniert. Das System war ein Clean Instal.

    Seltsam, dabei ist dieser Beitrag aktuell…

    • Hi
      Ich habe eine .desktop Datei und ich hab keine Ahnung wie ich die jetzt Autostarte.
      Klar Erklärung ist ja da aber egal was ich mache ich bekomme es nicht hin. Kann mir vielleicht jemand genauer erklären wie das funktioniert. Würd mich echt freuen?.

  5. #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will “exit 0” on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    /usr/bin/tool # ein Programm
    /usr/local/bin/script.sh # ein Shellskript
    /etc/init.d/dienst start # ein Dienst

    exit 0

    Das scheint bei mir nicht zu funktionieren, irgendwie tut sich da gar nichts und es kommt kein “Exit 0”. Was mache ich falsch?

  6. Hallo guten Abend,
    versuche verzweifelt eine eigentlich banale Sache zu verstehen. Kann den Monitor durch einen einfachen Klick auf irgend eine Taste der Tastatur wecken. Finde aber nirgends einen Hinweis wie man den Tastencode per Skript an den Raspi sendet ???
    Versuche mit xdotool funktionieren nicht, weil das Display nicht gefunden wird ?
    Das Skript soll gestartet werden wenn sich in FHEM bestimmte Daten ändern und diese dann per FTUI auf dem Monitor angezeigt werden sollen.
    Bin ratlos.
    LG Peter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.