Python Script per Cronjob ausführen - Raspberry

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

Ich habe an dem Raspberry ein AD- Wandler mit dem ich eine Spannung auslesen. Zurzeit starte ich das Python Sktipt mit
dem Befehl

Code: Alles auswählen

sudo python read_adwandler.py
danach ist jedoch ständig die Bash belegt, weil ständig eine Datei geschrieben wird:

open file `volt1.txt` mode ´w´ at 0xb6c44390
open file `volt1.txt` mode ´w´ at 0xb6c44355
open file `volt1.txt` mode ´w´ at 0xb6c44337
..................
............
........


ich habe es mit dem bearbeiten der crontab versucht, jedoch funktioniert es nicht
also ich habe folgendes in die crontab Datei geschrieben, wo sonst noch nichts drin steht ausser ein Text:

Code: Alles markieren

Code: Alles auswählen

@reboot sudo python /home/pi/read_adwandler.py
aber das auslesen des AD Wandlers wird nicht gestartet. Was mache ich falsch?
BlackJack

@Goldrausch: Wie meinst Du das in der ``crontab`` steht nichts drin? Wenn ``/etc/crontab`` tatsächlich leer war, dann stimmt da etwas nicht. Oder wo hast Du das eingetragen?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Zudem ist die crontab doch IMHO nicht der richtige Ort, um Programme beim Booten automatisch zu starten. Das würde ich eher in die `/etc/rc.local` setzen, ohne `sudo`, da `/etc/rc.local` bereits mit root-Rechten ausgeführt wird.
Und wenn Du das Skript vom Terminal aus im Hintergrund starten möchtest, setzt Du hinter die Befehlszeile ein '&'.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

wenn ich den Befehl:

Code: Alles auswählen

 /home/pi/read_adwandler.py & 
in die `/etc/rc.local`
schreibe, dann wird nach dem booten das py. Skript automatisch ausgeführt, aber ich kann mich nicht mehr einloggen.

D.h. es wird ständig der AD-Wandler ausgelesen aber ich möchte eigentlich, das es im Hintergrund passiert ohne das ich sozusagen etwas davon mitbekomme.

open file `volt1.txt` mode ´w´ at 0xb6c44390
413
open file `volt1.txt` mode ´w´ at 0xb6c44355
433
open file `volt1.txt` mode ´w´ at 0xb6c44337
423
..................
............
........
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Ich habe erst gestern angefangen mit Linux :oops: , aber ich glaube um in der Shell etwas im Hintergrund laufen zu lassen muss man ein & am Schluss anhängen.
z.B.

Code: Alles auswählen

nano &
http://www.howtogeek.com/111417/how-to- ... s-at-once/
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

Habe ich ja gemacht siehe oben, aber es wird nicht im Hintergrund ausgeführt.

Code: Alles auswählen

/home/pi/read_adwandler.py & 
BlackJack

@Goldrausch: Mit dem ``&`` am Ende dürfte das eigentlich nicht passieren. Wirklich nicht.
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

Es ist aber so :K
egal ob ich das py. Skript manuell per Terminal ausführe oder es beim starten automatisch ausführen lasse.

kann das eventuell an dem Python Skript liegen ?
BlackJack

@Goldrausch: Das kann nicht sein. Dann wäre Dein Raspberry und Deine Shell die einzige auf der Welt bei der das ``&`` nicht für eine asynchronen Ausführung sorgt. Dann lebst Du in einem Paralleluniversum und musst jemanden von dort fragen. ;-)
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

toll das hilft mir jetzt auch nicht weiter
das mit der & Funktion funktioniert ja mit anderen Befehlen, aber nicht mit diesem Python Skript.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich glaube du hast eine falsche Vorstellung davon, was es heisst, dass ein Programm im Hintergrund ausgefuehrt wird.

Das ganze heisst nicht mehr, als dass die Shell nicht abwartet bis sich das Programm beendet hat. Es heisst _nicht_ dass die Ausgabe umgeleitet / versteckt wird, das musst du selbst tun.

Kann es sein, dass du durch die Ausgabe den neuen Prompt der Shell uebersiehst?
BlackJack

@Goldrausch: Doch das funktioniert auch mit dem Python-Skript. Das was beim ``&`` passiert macht die Shell ganz unabhängig von dem Programm welches damit gestartet wird mit *jedem* Programm. Da hat das gestartete Programm keinen Einfluss drauf. Das könnte das nicht einmal verhindern wenn es das wollte.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Goldrausch: Poste doch mal Deine `/etc/rc.local`, auch wenn das jetzt eigentlich nicht mehr in dieses Forum gehört... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Goldrausch
User
Beiträge: 11
Registriert: Montag 16. Dezember 2013, 18:17

Hier der Inhalt der /etc/rc.local ganz unten habe ich das Python Script angehängt.

Code: Alles auswählen

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.local
# Required-Start:    $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
. /lib/lsb/init-functions
do_start() {
    if [ -x /etc/rc.local ]; then
            [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
        /etc/rc.local
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
        return $ES
    fi
}
case "$1" in
    start)
    do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

/home/pi/read_adwandler.py &   # startet AD-Wandler

exit 0
Zuletzt geändert von Anonymous am Mittwoch 18. Dezember 2013, 15:15, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@Goldrausch: Das ist nicht der Inhalt von ``/etc/rc.local``. Falls es das bei Dir tatsächlich ist: Wo kommt denn *der* Inhalt her? Das ist Code der die ``/etc/rc.local`` ausführt, gehört dort selbst also nicht hinein. Normalerweise sieht die Datei in frischem Zustand auf Debian Wheezy so aus:

Code: Alles auswählen

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

exit 0
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Goldrausch: Das ist doch nicht Deine `/etc/rc.local`...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten