Skript beim Start ausführen

189

Ich versuche ein Skript auszuführen, wenn mein Raspberry Pi hochfährt. Ich möchte, dass sich der Webbrowser automatisch öffnet.

Ich habe versucht, eine einfache Lösung zu finden (wie das Ablegen meines Skripts in einem "Start" -Verzeichnis oder ähnlichem), aber ich sehe so etwas nicht.

Ich habe mir Upstart angeschaut , aber ich habe Mühe zu verstehen, wie das funktioniert. Alle Skripte, die ich ausprobiert habe, haben beim Testen nicht funktioniert.

Tyler Murry
quelle
4
Welches Betriebssystem verwenden Sie? In FreeBSD, das ich auf meinem Pi verwende, können Sie Startskripte zu /usr/local/etc/rc.d/ oder einfach zu /etc/rc.local hinzufügen. Verschiedene Linux-Distributionen haben unterschiedliche empfohlene Methoden. Wenn Sie X darauf ausführen, sollten Sie möglicherweise Dinge zu Ihrer .xinitrcoder .xsessionDatei hinzufügen .
Ghoti
Weitere Informationen zum X-Startvorgang finden Sie hier .
Ghoti
6
Bitte beachten Sie die akzeptierte Antwort hier einige Einschränkungen hat und technisch nicht funktioniert alles beim Booten außer unter bestimmten Bedingungen beginnen. Lies es sorgfältig.
Goldlöckchen
Sie fragen nach einem Skript, das ausgeführt wird, wenn Sie sich anmelden, nicht beim Booten des Pi oder beim Start. Zwei sehr unterschiedliche Dinge, und der Titel verzerrt die Google-Suchergebnisse.
9.

Antworten:

197

Sehen Sie sich dieses Tutorial an, um Midori beim Start auszuführen . Lesen Sie weiter für DIY-Lösungen.


Sie können Ihr Skript ausführbaren Befehl an der Unterseite hinzufügen .bashrcdas wird führen Sie Ihr Skript jedes Mal , öffnen Sie ein Terminal (oder führen Sie eine neue Instanz bash) .

  1. Stellen Sie sicher, dass Sie sich im piOrdner befinden:

    $ cd ~
    
  2. Erstellen Sie eine Datei und schreiben Sie ein Skript, das in der Datei ausgeführt werden soll:

    $ sudo nano superscript
    
  3. Speichern und beenden: Ctrl+ X, Y,Enter

  4. Zur .bashrcKonfiguration öffnen :

.bashrcist NICHT zum Ausführen von Skripten vorgesehen.

Es wird jedes Mal ausgeführt, wenn eine nicht angemeldete interaktive Shell gestartet wird, und wird zum Konfigurieren der Shell verwendet.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Scrolle nach unten und füge die Zeile hinzu: ./superscript

  2. Speichern und beenden: Ctrl+ X, Y,Enter


Wenn Sie nach einer Lösung suchen, die beim Booten der Konsole funktioniert , sehen Sie sich diesen Link an . Grundlegender Überblick:

  1. Erstellen Sie eine Datei für Ihr Startskript und schreiben Sie Ihr Skript in die Datei:

    $ sudo nano /etc/init.d/superscript
    
  2. Speichern und beenden: Ctrl+ X, Y,Enter

  3. Machen Sie das Skript ausführbar:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Registrieren Sie das Skript, das beim Start ausgeführt werden soll:

    $ sudo update-rc.d superscript defaults
    

Wenn Sie möchten, dass ein Skript beim Booten in die LXDE-Umgebung ausgeführt wird , können Sie sich diesen Beitrag im Raspberry Pi-Forum ansehen :

  1. Navigiere zu ~/.config/lxsession/LXDE-pi

  2. Öffnen Sie die autostartDatei in diesem Ordner:

    $ sudo nano autostart
    
  3. Fügen Sie @midorieine neue Zeile hinzu. Wenn Sie so etwas wie ein Python-Skript ausführen möchten, setzen Sie so etwas wie @python mypython.pyin eine neue Zeile. Das Ausführen einer Skriptdatei wäre @./superscript, aber aus irgendeinem Grund wird das Skript in einer Endlosschleife ausgeführt (möglicherweise wird dies das beenden).

  4. Speichern und beenden: Ctrl+ X, Y,Enter

  5. Starten Sie Ihren Raspberry Pi in der LXDE-Umgebung neu.

syb0rg
quelle
Das Tutorial zum Einrichten von Midori beim Start war genau das, wonach ich gesucht habe. Ich bin mir nicht sicher, warum es so viele Möglichkeiten gibt, so etwas Einfaches zu tun, aber ich bin froh, dass es jetzt funktioniert.
Tyler Murry
1
@ syb0rg Wenn ich mich über ssh anmelde, funktioniert der Run at Login-Teil wie ein Zauber (+1), aber nicht, wenn die lxde-Desktopsitzung startet. gibt es eine möglichkeit das zu tun?
George Profenza
@GeorgeProfenza Wann $ sudo startx?
syb0rg
2
Ich wollte nur darauf hinweisen, dass das Pyhton-Skript ausgeführt wird, aber wenn Fehler auftreten, wird es nur irgendwo im Hintergrund mit der Methode / etc / xdg / lxsession / LXDE / autostart abgelegt. Die Verwendung von .barshrc wird auch Fehler aufdecken, aber es ist wirklich wichtig, sicherzustellen, dass das Skript an erster Stelle eng ist (fand das auf die harte
Tour
7
.bashrcwird nicht gelesen, wenn das System startet oder wenn sich ein Benutzer anmeldet , sondern nur beim Öffnen eines neuen Terminals (und wird jedes Mal gelesen, wenn der Benutzer ein neues Terminal öffnet). Ich bin verblüfft, dass diese Antwort so viele positive Stimmen bekommen hat: Der erste Teil ist einfach falsch . Der dritte Teil ist korrekt, um ein GUI-Programm auszuführen.
Gilles
46

Die Art und Weise, wie ich die meisten Leute gesehen habe (siehe Raspberry Pi-Foren) und mich selbst mit Erfolg gemacht habe, ist die Verwendung /etc/rc.local.

Alles, was Sie hier tun müssen, ist ./myscriptin die rc.local-Textdatei zu schreiben. Wenn es in Python ist, setzen Sie python myscript.py.

Dies ist buchstäblich "eine einfache Lösung (wie das Ablegen meines Skripts in einem" Startverzeichnis "oder in einem ähnlichen Verzeichnis)". Vielleicht suchen Sie auch in den Foren, wenn Sie Fragen haben. Diese Lösung ergab sich aus den ersten 4 Ergebnissen von a Google-Suche!

avidreader610
quelle
4
FYI das rc.local hat standardmäßig verschiedene Kommentare über das Skript, das nichts tut und ausführbare Bits benötigt, die geändert werden. Dies ist nicht wahr, geben Sie einfach den Befehl für Ihr Skript vor dem Beenden 0 ein und es wird beim Start ausgeführt. Stellen Sie sicher, dass Ihr Skript im Hintergrund ausgeführt wird. Andernfalls wird die Anmeldeaufforderung blockiert. Ja, das habe ich getan.
Rob
@rob Meinst du, sie schlagen das Skript als ausführbar vor? Dies wird in der Frage gemildert, indem das Skript über den Befehl ausgeführt wird python myscript.py. Wenn Sie chmod + x hinzufügen möchten #! /bin/python, können Sie das Skript ausführen, indem Sie " $pathtofile/myscript.pywhere $pathtofileis" ausführen, .wenn Sie sich im selben Verzeichnis oder im absoluten oder relativen Pfad zur Datei befinden.
JFA
1
Das ist nicht gut für ein GUI-Programm wie einen Browser. /etc/rc.localdient nur zum Starten von Systemdiensten (Programme ohne Benutzeroberfläche).
Gilles
1
@ ErickM.Sprengel Verwende eine der richtigen Antworten für diesen Thread, wie zum Beispiel diese .
Gilles
32

Fügen Sie es der crontab hinzu

Die crontab führt Befehle zu definierten Zeiten aus.


Bearbeiten Sie die Datei:

sudo crontab -e

Zeile zur Datei hinzufügen (hier ein Python-Skript):

@reboot python3 /home/pi/Desktop/exemple.py &
Aaron
quelle
2
Um hier ein bisschen pingelig zu sein, technisch ist es nicht crontab, das den Befehl ausführt, sondern sowieso. In Bezug auf die aufzulistende Zeile ist es ratsam, vollständige Pfade für die hier definierten Befehle anzugeben (in diesem Fall den vollständigen Pfad zu python3), siehe hier
Ghanima
Dies ist die Methode, die ich aufgrund ihrer Einfachheit immer angewendet habe. +1
Patrick Cook
Das ist nicht gut für ein GUI-Programm wie einen Browser. /etc/rc.localdient nur zum Starten von Programmen, die keine Benutzeroberfläche haben.
Gilles
2
Nachdem ich viel zu viel Zeit damit verbracht hatte, es mit rc.local und init.d und vielen anderen Dingen zum Laufen zu bringen, funktionierte das sofort! Vielen Dank!
Piotr Kula
4
Dies funktioniert aus irgendeinem Grund nicht in RPI OS
Denis
11

Autostart von xorg-Apps

Wenn für das zu startende Skript eine xorg-Sitzung erforderlich ist, versuchen Sie möglicherweise, die Spezifikation für den automatischen Start von freedesktop zu befolgen, die je nach verwendeter Desktopumgebung möglicherweise funktioniert oder nicht.

Alternativ können Sie auf Ihre spezifische Desktop-Umgebung abzielen, wie unter https://wiki.archlinux.org/index.php/autostarting beschrieben .

Ausführen eines Skripts als systemd-Dienst

Wenn Ihr Skript der Beschreibung eines Daemons oder eines "Dienstes" entspricht und auf Ihrem System systemd ausgeführt wird, was für Raspbian und die meisten modernen Sprachen der Fall ist, können Sie Ihr Skript so konfigurieren, dass es als systemd-Dienst ausgeführt wird die Lebenszyklus- und Ausführungsumgebung sowie die Voraussetzungen für das (erneute) Starten des Skripts, z. B. das laufende Netzwerk. Es ist auch möglich, den Neustart des Dienstes im Falle eines Fehlers ( Restart=alwaysund einer Verzögerung zwischen dem Neustart, z RestartSec=10. B. ) zu konfigurieren .

Für den systemweiten Einsatz erstellen Sie Ihre systemd Unit-Datei unter /etc/systemd/system, zB mit vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Siehe auch:

Jetzt können wir den Service testen:

systemctl start autossh

Überprüfen des Status des Dienstes:

systemctl status autossh

Beenden des Dienstes:

systemctl stop autossh

Sobald Sie überprüft haben, dass der Dienst wie erwartet funktioniert, aktivieren Sie ihn mit:

systemctl enable autossh

ANMERKUNG: Aus Sicherheitsgründen systemdwird das Skript in einer eingeschränkten Umgebung ausgeführt, ähnlich wie crontabSkripte ausgeführt werden. Nehmen Sie daher keine Annahmen über bereits vorhandene Systemvariablen vor. Verwenden Sie die EnvironmentTasten, wenn für Ihr Skript bestimmte Variablen definiert werden müssen. Wenn Sie set -xIhr Bash-Skript oben hinzufügen und dann ausführen, können Sie systemctl status my_servicemöglicherweise feststellen, warum Ihr Skript fehlschlägt. Verwenden Sie in der Regel immer absolute Pfade für alles, einschließlich echound cat, oder definieren Sie explizit Ihren $ PATH.

ccpizza
quelle
7

Ich möchte meine zwei Cent einwerfen, auch wenn dies eine alte Frage ist, die häufig gestellt wird, um eine einfache Sache zu tun - Autostart. Ich habe alle Lösungsvorschläge in allen Antworten auf diese Frage ausprobiert. Keiner von ihnen hat für mich gearbeitet. Ich benutze Raspberry PI Model 2 mit Raspbian.

Der einzige Weg, wie ich meine Anwendung erfolgreich zum Autostart bringen kann, ist über ein Skript wie folgt. Ich sage erfolgreich, weil meine Anwendung erwartungsgemäß gestartet wurde, ohne dass Probleme wie das Beginnen mit einem falschen Arbeitspfad aufgetreten sind.

1.Erstellen Sie eine leere Datei mit der Erweiterung .sh und benennen Sie sie nach Belieben.

2.Kopieren Sie und fügen Sie das folgende GENAU ein, außer ändern Sie "Ihren Anwendungsnamen" in den Skriptnamen, den Sie gerade erstellt haben.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Speichern Sie dann die Skriptdatei in Ihrem Anwendungsordner

  2. Öffnen Sie dann den /home/pi/.config/autostartOrdner. Es könnte in Ihrem Fall anders sein. Öffnen Sie einfach Ihren privaten Ordner und aktivieren Sie die Ansicht versteckter Ordner. offen .config/autostart. Wenn der Autostart-Ordner nicht angezeigt wird, erstellen Sie einen Ordner namens Autostart im Ordner .config.

  3. Im Autostart-Ordner müssen Sie eine Verknüpfung zu Ihrer Skriptdatei erstellen, die Sie wie folgt erstellt haben. Erstellen Sie eine leere Datei mit der Erweiterung .desktop.

  4. Kopieren und fügen Sie den folgenden in der leeren Desktop - Datei außer Sie ändern müssen Comment, Name, Exec, Pathund IconFeldwert.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Speichern und schließen Sie die Datei, nachdem Sie alle erforderlichen Felder geändert haben. Du bist fertig. Probieren Sie es einfach aus.

ThN
quelle
Technisch gesehen wird dieses Skript vom System und nicht von einem bestimmten Benutzer ausgeführt. Vielleicht gehört Ihre Anwendung also besser in /usr/local/bin/ApplicationName...?
SlySven
@SlySven "das System" ist ein bestimmter Benutzer.
Eingeschränktes Sühnopfer
Wird es als root (UID = 0) oder als pi-Benutzer (UID ~ 500 oder 1000 IIRC) ausgeführt? Wird es als root oder als andere System- UID (weniger als 500) ausgeführt, empfiehlt es sich traditionell , die Skriptdatei zu speichern ( Englisch: www.mjfriendship.de/en/index.php?op...37&Itemid=32 oder von dem es abhängt) auf dem Root - Gerät, so dass, sollte es ein Problem mit einem anderen Gerät geben (z. B. homewenn es sich um ein separates Gerät handelt), kein Problem mit der Skriptdatei (oder einer ausführbaren Datei) vorliegt, wenn das nicht verfügbar ist System fällt auf eine einzelne Benutzer- /bin/shShell zurück! Heute ist die systemdist Art und Weise sowohl zu montieren /und /usrvor PID 1 gestartet ...
SlySven
5

Ich hatte auch Probleme damit. Auf dem Raspberry Pi3 mit Raspbian habe ich Folgendes getan:

  1. Erstellen Sie ein Start-Shell-Skript in Ihrem Stammverzeichnis (ich habe mein "launch" genannt):

sudo leafpad launch.sh

  1. Speicher die Datei
  2. Bearbeiten Sie die LXDE-pi-Autostartdatei

sudo leafpad /home/pi/.config/lxsession/LXDE-pi/autostart

  1. Fügen Sie dies am Ende dieser Datei hinzu

./launch.sh

  1. neustarten
Lamarant
quelle
3

Auf dem Raspberry Pi3 mit Raspbian Stretch habe ich Folgendes getan:

Bearbeiten Sie die LXDE-pi-Autostartdatei

    sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

Fügen Sie dies am Ende dieser Datei hinzu

    @sudo python3 /path/to/your/script.py

Speichern und neu starten

Amr Sohil
quelle
1

Methode 1:

Um einen Befehl bei der Anmeldung automatisch zu starten, fügen Sie den Befehl in eine Datei mit dem Namen ein

.bashrc

im Benutzerverzeichnis (zum Beispiel / home / pi)

.bashrcist NICHT zum Ausführen von Skripten vorgesehen.

Es wird jedes Mal ausgeführt, wenn eine nicht angemeldete interaktive Shell gestartet wird, und wird zum Konfigurieren der Shell verwendet.
~/.bashrc: executed by bash(1) for non-login shells.

Beispielsweise könnte die Datei enthalten

chromium-browser --kiosk www.google.com

Zum Starten von Chromium im Vollbildmodus wird auf www.google.com verwiesen


Methode 2:

Diese Lösung funktioniert wirklich gut. Sobald der Browser geladen ist, befindet sich oben links auf dem Bildschirm ein kleines schwarzes Quadrat. Dies scheint ein allgemeiner Fehler zu sein (der in anderen Foren erwähnt wird), ansonsten verbirgt der Vollbildmodus alles außer der Browserseite.

Bearbeiten Sie die Autostart-Datei:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Kommentieren Sie alles mit einem '#' am Anfang jeder Zeile und fügen Sie dann die folgenden Zeilen hinzu

Starten Sie den Browser automatisch

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

Verwenden Sie bei Bedarf das Konfigurationstool, um das automatische Ausführen der GUI beim Einschalten zu aktivieren

sudo raspi-config

Wenn Sie an die Eingabeaufforderung beenden zurück CTRL+ ALT+F1

CTRL+ ALT+F2

User98764431
quelle
0

Sie können Ihr Skript am Ende der /etc/profileDatei platzieren.

Andere Optionen haben bei mir nicht funktioniert, aber das liegt vielleicht daran, dass ich mein Skript auf dem Desktop platziert habe.

HelpNeeder
quelle
0

Erstellen Sie eine .sh-Datei mit den Befehlen 'python /path/to/your/script.py', geben Sie 'sudo nano /etc/rc.local' ein und geben Sie den Pfad zur .sh-Datei ein

Vor

exit 0

Oder Sie könnten einfach eintippen

crontab -e

oder

sudo crontab -e 

Wenn Sie möchten, dass das Skript beim Start ausgeführt wird

innerhalb der Datei eingeben

@reboot python /path/to/your/script.py &
Deepesh
quelle
2
Für crontab-Einträge wird die Verwendung vollständiger Pfade dringend empfohlen!
Ghanima
-2

es FUNKTIONIERT. (Bei jedem Neustart werden die folgenden Übermittlungen automatisch vorbereitet)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0
Yum Yum yum
quelle
-2

Das ist es, was ich normalerweise tue.

  1. Speichern Sie Ihre Datei im Himbeer-Pi-Ausgangsverzeichnis. ZB: mycode.py
  2. Bearbeiten Sie die Datei:

    sudo nano .bashrc

.bashrcist NICHT zum Ausführen von Skripten vorgesehen.

Es wird jedes Mal ausgeführt, wenn eine nicht angemeldete interaktive Shell gestartet wird, und wird zum Konfigurieren der Shell verwendet.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Gehe zum Ende der Datei und schreibe:

    sudo python mycode.py

  2. Wenn die Ausgabe in einer TXT-Datei gespeichert werden soll, bearbeiten Sie den Code in Schritt 3 wie folgt:

    sudo python mycode.py >> output.py

Hoffe das hilft!

Doe.John
quelle