Ausführen eines Python-Skripts beim Start

29

Diese Frage wurde schon einige Male gestellt, aber ich schien sie mit den vorhandenen Informationen nicht zum Laufen zu bringen.

Mein Pi läuft Raspbian. Ich habe ein Python-Skript namens dnscheck.py, das sich für immer wiederholt.

Ich brauche es, um beim Booten zu laufen. Ich weiß, ich muss eine .sh-Datei erstellen, die so etwas wie enthält

sudo python dnscheck.py &

Was ich nicht weiß, ist, wo diese Datei sein sollte oder ob sie etwas anderes enthalten sollte. Ich kenne den Ordner init.d, aber ich stelle mir vor, dass es einen einfacheren Weg gibt, diese einfache Aufgabe zu erledigen, wenn ich das Beispiel für ein Skelett sehe.

Vlad Schnakovszki
quelle
für eine wirklich einfache möglichkeit checke diese schrittweise Anleitung -> youtu.be/Tvnrx-2QaUU mache so viele Trägerraketen wie du brauchst und adressiere sie alle in crontab
Hossein RM

Antworten:

20

Wenn Sie den Prozess mit Befehlen wie "Start", "Stopp", "Neustart" usw. mithilfe des Skelettskripts steuern möchten, ist eine Änderung für Ihre Zwecke möglicherweise die beste Option.

Wenn der Prozess nur gestartet werden soll, geben Sie den Befehl in ein /etc/rc.local. (Ich habe mein RPi nicht zur Hand, aber ich habe online gelesen, dass es eine 'exit 0'-Zeile gibt. Sie sollten Ihren Befehl über diese Zeile setzen.)

Ikku
quelle
1
Es funktionierte! Ich muss hinzufügen, dass das Setzen der Berechtigungen für das Skript und rc.local zurück auf 755 (Lesen / Schreiben / Ausführen) ein Muss ist. Ich bin mir nicht sicher, ob beide diese Einstellung benötigen, aber sie hat bei mir funktioniert. Vielen Dank für die Hilfe!
Vlad Schnakovszki
7
"Wie du es in deiner Frage geschrieben hast" Nicht ganz - du brauchst kein sudo, da rc.localläuft root. Sie sollten natürlich auch den vollständigen Pfad zum Skript angeben. Sie sollten auch& am Ende hinzufügen, damit sich das Skript teilt, z /path/to/foobar.py &.
Goldlöckchen
1
@goldilocks könntest du bitte erklären, warum ich hinzufügen muss &? Denn wenn ich es ohne benutze, funktioniert alles noch wie erwartet.
Huy.PhamNhu
2
@ Huy.PhamNhu Beantwortung Ihrer Frage: Der Pi führt dieses Programm beim Booten und vor dem Starten anderer Dienste aus. Wenn Sie das kaufmännische Und nicht angeben und Ihr Programm kontinuierlich ausgeführt wird, wird der Startvorgang des Pi nicht abgeschlossen. Das kaufmännische Und ermöglicht es dem Befehl, in einem separaten Prozess ausgeführt zu werden und mit dem Booten des Hauptprozesses fortzufahren.
Amine Harbaoui
6

Verschieben Sie Ihr Skript (wir speichern es in der Datei dnscheck) nach /etc/init.d/und legen Sie die Berechtigungen fest, damit es ausgeführt werden kann:

chmod 755 /etc/init.d/dnscheck

Fügen Sie oben in Ihrem Skript LSB-Init-Tags hinzu . Möglicherweise möchten Sie Required-Start / Stop und die Description-Tags an Ihr Skript anpassen.

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Erstellen Sie dann die symbolischen Links, indem Sie ausführen

update-rc.d /etc/init.d/dnscheck defaults
Bert
quelle
2
Bitte beachten Sie, dass dies vor dreieinhalb Jahren eine anständige Antwort war und immer noch funktioniert, da das neue Init-System von Raspbian mit LSB / SysV-Skripten abwärtskompatibel ist. Neue Benutzer sollten jedoch besser lernen, stattdessen das neue System zu verwenden ( systemd ), wenn das Hinzufügen einer Zeile zu /etc/rc.localnicht ausreicht.
Goldlöckchen
3

Natürlich gibt es viele Möglichkeiten, aber vergessen Sie nicht, dies zu tun cron. Wenn Sie eine @rebootZeile in Ihre crontab einfügen, wird dieser Befehl bei jedem Neustart ausgeführt.

Zum Testen habe ich meinem Benutzer crontab mit der folgenden Zeile hinzugefügt crontab -e: @reboot echo "$(date)" >> ~/boot.txt Der Vorteil dieser Methode besteht darin, dass Sie den Job nach Bedarf in anderen Intervallen als nur zur Startzeit aufrufen können und keine Init-Skripte bearbeiten müssen.

Bobstro
quelle
3

Wenn Sie eine rc.local-Datei verwenden, kann dies zur Fehlerbehebung hilfreich sein. Sie können Protokollierungszeilen hinzufügen, um Fehler (stderr) und Befehlsausgaben (stdout) in der Protokolldatei zu protokollieren. Gemäß diesem Beispiel wird diese Datei in /tmp/rc.local.log gespeichert

#!/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.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

Lesen Sie mehr

Tharanga
quelle
3

Ich bin wirklich überrascht, dass die Daemontools von DJB hier nicht erwähnt werden. Daemontools führt die ordnungsgemäße Prozessüberwachung durch und Sie können coole Funktionen wie die automatische Protokollierung in Rotation hinzufügen. TL; DR Wenn Sie mit nichts davon vertraut sind, wird Ihr Prozess bei jedem Fehlschlagen neu gestartet und startet automatisch, wenn sich Ihr Pi einschaltet. Dies ist großartig, wenn Sie ein fehlerhaftes Python-Programm mit Fehlermodi geschrieben haben, aber nicht möchten, dass es nur stirbt, wenn ein Fehler auftritt.

Installieren:

sudo apt-get install daemontools daemontools-run

Führen Sie dann die folgenden Schritte aus, um daemonisierte Prozesse zu erstellen:

Meistens ist es so einfach wie das Kopieren eines runSkripts in einen /etc/service/<my_custom_service_name>anderen Vorteil: Sie können als jeder Benutzer oder Root ausgeführt werden! Details im Link.

FWIW Ich hatte ein Pi-Projekt, in dem ich 3 verschiedene Python-Prozesse hatte (jeder hatte eine Ausführungsschleife unter Verwendung der CPU-Zeit, so dass ich unter Verwendung von 3 Prozessen jedem Prozess erlaubte, 1 CPU-Kern zu nutzen). Daemontools ermöglichte es mir, sicherzustellen, dass alle 3 automatisch ausgeführt werden und weiterhin ausgeführt werden, nachdem ich den Pi angeschlossen habe.

Sam
quelle
einfache und einfache Lösung, Sie Antwort viel Zeit gespart, danke ..
ShivaGuntuku
2

Hier ist die Lösung, die ich ständig benutze.

Erstellen Sie eine Desktop-Datei

xyz.desktop

Geben Sie Folgendes ein

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

füge diese Datei in das ein

/home/pi/.config/autostart/

und starten Sie Ihre Himbeer-Pi und es sollte Ihr Programm in einem neuen Terminal automatisch ausführen

evolutionizer
quelle
Bitte keine Antworten auf mehrere Fragen ausschneiden und einfügen. Wenn die Antwort dieselbe ist, sollte die neuere Version als Duplikat gekennzeichnet werden.
Steve Robillard
Der einzige Grund, warum ich es nicht getan habe, war, dass diese Seite eine größere Anzahl von Ansichten hatte als die andere.
Evolutionizer
@SteveRobillard Ich glaube auch nicht, dass ich den Repräsentanten dazu habe
Evolutionizer
Das Markieren eines Beitrags dauert nur 15 Wiederholungen. Die Entscheidung darüber, was zu tun ist, liegt bei den Moderatoren - daher ist die Anzahl der Aufrufe irrelevant. Doppelte Antworten werden vom System automatisch markiert. Sie sind eine Form des Spielens des Systems. Deshalb habe ich den dritten gelöscht.
Steve Robillard
@SteveRobillard Danke für die Information und verzeih meine Unwissenheit. Ich habe dort für die vorherige Frage als Duplikat gekennzeichnet.
Evolutionizer
2

Um eine .py-Datei zu verwenden, setzen Sie einfach die Zeile ganz #!/usr/bin/pythonam Anfang Ihrer Datei. Dann mache es ausführbar mit chmod +x filename. Als nächstes fügen Sie die Zeile /path/to/file.py &zu /etc/rc.localvor der exit 0Linie (Swapping /path/to/file.pymit dem Pfad zu Ihrem Skript). Dadurch wird Ihr Python-Skript am Ende des Startvorgangs ausgeführt.

Theoremiser
quelle
0

Hier ist eine noch einfachere Methode, die bei mir funktioniert hat. Ändern Sie den Autostart in LXDE.

Öffnen Sie ein Terminal und bearbeiten Sie die Autostart-Datei wie folgt:

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

Fügen Sie die folgende Textzeile am unteren Rand hinzu (ändern Sie den Pfad nach Bedarf, bis sich Ihre example.py befindet).

@/usr/bin/python /home/pi/example.py

ctr-x und speichern. Möglicherweise müssen Sie das Python-Skript wie folgt ausführbar machen:

sudo chmod +x /home/pi/example.py

Referenz für Autostart in LXDE und Referenz, um Python ausführbar zu machen

Hydronik
quelle
Beachten Sie, dass dies nicht funktioniert, wenn Sie nicht in einem GUI starten (dh: Führen Sie Ihr PU kopflos aus)
Havnar
0

Diese Lösungen haben bei mir nicht funktioniert, als ich versuchte, ein Python-Skript mit Feh zu starten. Folgendes hat funktioniert. Es startet ein Skript nach dem Login.

Öffnen Sie eine Terminalsitzung und bearbeiten Sie die Datei

sudo nano /etc/profile

Fügen Sie die folgende Zeile am Ende der Datei hinzu

/home/pi/your_script_name.sh

Ersetzen Sie den Skriptnamen und -pfad durch den korrekten Namen und Pfad Ihres Startskripts. Speichern und schließen

Drücken Sie Strg + X, um den Nano-Editor zu beenden, gefolgt von Y, um die Datei zu speichern.

So sah meine script.sh aus:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

Ich glaube, ich habe sowohl script.sh als auch script.py mit dem chmod ausführbar gemacht

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
Hydronik
quelle