Script stoppen oder killen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    wie kann ich ein laufendes bash script stoppen??

    Das untenstehede python scrip ruft mit os.systems ein bash script als /bin/test auf
    nach dem if pfd.input_pins[3].value > 0 : wahr ist

    Ich moecht jetzt das bash script "test" stoppen, wenn if pfd.input_pins[3].value < 1 :
    nicht mehr wahr ist.

    So wie ich es versucht habe geht es aber nicht.


    Wie kann man das erreichen??
    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (4. Mai 2014 um 15:45)

  • Welche Werte liefert denn pfd.input_pins[3].value?

    Du startest wenn der Wert größer als 0 ist. (0.1, 0.2, ..., 1, 2, 3, 4, ...)
    Du beendest wenn der Wert kleiner als 1 ist. (0.9, 0.8, ..., 0.2, 0.1, ..., 0, -1, -2, ...)

    In Deiner Abfrage besteht also eine Deckungsgleichheit. (0.1, 0.2, ..., 0.8, 0.9)

    Außerdem (könnte aber beim einfügen passiert sein) hast Du Dich nicht an eine einheitliche Formatierung gehalten.
    ENTWEDER 4 Leerzeichen pro indention ODER 8. Ein Mix wird nicht gerne gesehen.

    /edit: und jetzt sehe ich erst, das die Abfrage zum beenden AUßERHALB der Schleife ist. Das Programm kommt also niemals zu dieser Abfrage...

    Gruß, Scholli.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (4. Mai 2014 um 16:35)

  • Hallo,
    der Wert ist entwender 1 oder 0.
    Die unterschiedlichen Abstaende sind beim kopieren passiert, sorry.

    Heiss das jetzt das wenn es tatsaechlich 1 oder 0 ist es mit killall -v /bin/test funktionieren muesste??

    gruss
    gwaag

  • Wenn Du die Werte 0 oder 1 ERWARTEST, kann man die doch auch direkt abfragen.
    Also "if WERT == 0:" und "if WERT == 1:"

    Der Fehler liegt aber primär bei den indentions.
    Die zweite IF Abfrage wird niemals abgerufen.

    /edit: und nochwas...
    Die Schleife wiederholt sich ja ständig. Damit wird auch die Abfrage ständig wiederholt.
    Das heißt, wenn der Wert 1 ist, wird das Programm ständig neu gestartet.
    Bei 0 führt das Programm STÄNDIG den Killall Befehl aus.
    Hier wäre eine Abfrage zur Statusänderung sinnvoll.

    Code
    status_x = 0
    
    
    while 1:
        wert = pfd.input_pins[3].value
        if wert not status_x:
            status = wert
            if status_x == 0: os.system("killall -v /bin/test")
            if status_x == 1: os.system("/bin/test")

    So sollte es sauber laufen.

    /edit: Habe vorher "status" verwendet. Dies ist aber eine Variable, die vom System verwendet wird.
    Wurde ersetzt durch "status_x"
    Außerdem habe ich den "killall" Befehl in os.system eingefügt. Über "killall" wird hier aber noch diskutiert.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (9. Mai 2014 um 05:50)

  • Hallo,
    ja mit ==1 oder ==0 geht es auch. Nur bekomme ich folgenden Fehler.

    pi@raspberrypi /bin $ python /bin/Testknopf1.py
    File "/bin/Testknopf1.py", line 29
    if wert not status:
    ^
    SyntaxError: invalid syntax


    Hier noch den ganzen code: (mit for x in range (10) leuchten die LED`s 5 x)

    Ist status = 0 am richtigen Ort eingefuegt?

    gruss
    gwaag

  • Code
    wert = pfd.input_pins[3].value == 1


    kann ja auch nicht funktionieren. Da hat sich wohl noch ein kleines Fehlerteufelchen eingeschlichen... ;)

    Das ist übrigens immer so. Wenn es zu einer Fehlermeldung kommt, die "eigentlich keine sein sollte", muss man sich einfach mal die davor liegenden Zeilen genauer angucken. Da steckt dann meistens ein Klammerfehler oder ähnliches.

    Hier hast Du wieder einen Codeschnipsel AUßERHALB der Hauptschleife gesetzt. Die werden nicht abgearbeitet. Da kannste Dich auffn Kopp stellen, aber das Programm ignoriert das einfach...

    Achte beim einfügen von Code dadrauf, das Du die Leerzeilen mit kopierst. Notfalls muss man dann halt mal nachzählen. So kann Dir sonst nur sehr schwer geholfen werden, bzw. man spricht als erstes die fehlerhaften Einrückungen an. Das ist nicht sehr zielführend, wenn man ständig erwähnen muss, dass die Abstände nicht mitkopiert worden sind. Der Forumeditor bietet hier die Funktion "VORSCHAU". Da kann man nochmal alles prüfen, bevor man seinen Code auf die Reise schickt.

    Hier mal alles korrekt zusammengesetzt.

    /edit: Habe vorher "status" verwendet. Dies ist aber eine Variable, die vom System verwendet wird.
    Wurde ersetzt durch "status_x"
    Außerdem habe ich den "killall" Befehl in os.system eingefügt. Über "killall" wird hier aber noch diskutiert.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (9. Mai 2014 um 05:59)

  • Da gibt es jetzt zwei Möglichkeiten.
    1. Es wurden unsichtbare Sonderzeichen mit rein kopiert (ist mir auch schon oft vorgekommen).
    2. Warscheinlicher ist aber, dass "pfd.input_pins[3].value" so nicht funktioniert. Kenn mich mit Piface aber jetzt nicht speziell aus.

    Lass Dir doch mal die Werte einfach so anzeigen.

    Code
    #!usr/bin/python
    
    
    import pifacedigitalio
    pfd = pifacedigitalio.PiFaceDigital()
    
    
    while 1:
        print pfd.input_pins[3].value

    Würde jetzt mal ins Blaue tippen, das ".value" hinter dem Zeiger [3] zu einer Fehlfunktion führt.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

  • Hallo,

    pi@raspberrypi /bin $ python /bin/versuch

    Mit Deinem Script: Ist Taster (pin 3) nicht gedrueckt = Ausgabe 0
    Ist Taster (pin 3) gedrueckt = Ausgabe 1

    Laeuft problemlos durch, nicht gedruckt 00000000000000000 gedrueckt 1111111111111111111111

    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (4. Mai 2014 um 19:23)

  • Dann würde ich doch bei meiner ersten Vermutung bleiben.
    Lösche dafür ALLE Leerzeichen vor "if wert not status" und füge entsprechend viele von Hand ein. Wenn das noch nicht funktioniert, eine Zeile weiter nach oben und das selbe nochmal.

    Bei LeerZEILEN werden auch gerne mal unsichtbare Sonderzeichen bzw. Formatierungszeichen eingesetzt. Der Fehler muss irgendwo vor dem "if wert not status" liegen.

    Generell gilt: Traue keinem Editor. ;)

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

  • Dann bin ich mit meinem Latein erstmal am Ende... :(

    Ein paar Ideen hätt ich vllt. noch.
    Lösche mal alles unter und inklusive "if wert not status" und starte mal.
    Kannst ja noch ein "print wert" einsetzen, damit wenigstens etwas passiert.

    Wenn das erfolgreich läuft, kann man weiter eingrenzen. Bis dorthin ist also alles OK.
    Setze statt "wert" und "status" mal andere Variablen ein, z.B. "xxwert" und "xxstatus".
    Vllt. werden diese Variablen von Piface schon benutzt.

    Dann könnte man das "not" noch durch ein "<>" austauschen.

    Mehr würde mir jetzt aber echt nicht einfallen. :s

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

  • Hallo,
    ich bin erst Anfänger und möchte nur kurz etwas einwerfen (schön, wenn es jemandem helfen sollte...) :

    Da ich Anfänger bin, habe ich noch nicht herausgefunden, ob das obige Script in Python 2.x oder 3.x geschrieben ist (an einer print-Anweisung hätte ich es sehen können - gibt aber keine).

    Bei Python 3 ist es "verboten", Tabs und Leerzeichen zu mischen, d.h man sollte sich
    (generell) für eine Methode entscheiden, bei Python 2.x ist es (relativ) egal.

    gwaag:
    hast du Skript einmal mit 2.x und 3.x ausprobiert ?

    by the way:

    Code
    #!/usr/bin/env python


    => gilt für Windows und Linux, falls man auf verschiedenen Sytemen arbeitet.

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo,

    Also jetzt laeuft es mindestens wieder durch und zwar so;

    Programm /bin/test startet nach druecken von Taster (pin3) (Lampen gehen an)
    Wenn Taster (pin3) losgelassen wird, laeft aber Programm normal weiter anstatt zu stoppen.

    Woran kann denn das jetzt noch liegen??
    Ganzer code:


    gruss
    gwaag


    so #!/usr/bin/python ist schon richtig

    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (6. Mai 2014 um 06:23)

  • gwaag:
    auf die Gefahr hin, dass ich mich jetzt blamiere (aber ich möchte dazulernen und da ist debugging gut geeignet - ein "sorry" an die Könner):

    1.
    gebe dir bitte Mühe, hier im Code-Abschnitt den Code auch richtig einzurücken.

    2.
    warum 2x

    Code
    if

    und nicht

    Code
    if... elif

    3.
    mit

    Code
    break

    kann man Schleifen stoppen

    4.

    Code
    <>

    gibt's in Python (3, 2[?]) nicht =>

    Code
    !=


    dbv:
    danke !

    Edit:
    Link
    === edit ende ===

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

    Einmal editiert, zuletzt von Perlchamp (4. Mai 2014 um 21:36)

  • Hallo,
    Danke fuer Deine Hilfe, leider bin ich Anfaenger und muss mich auf die alten Hasen hier im Forum verlassen.
    Ich benutzte wheezy und Python 2.7.3.
    Das mit dem einruecken habe ich noch nicht ganz verstanden, schiebe es dann halt bis es geht. Muss mich da mal besser einlesen.

    gruss
    gwaag

    • Offizieller Beitrag

    killall -v /bin/test ohne subprocess bzw. os.system()? wobei ersteres immer zu bevorzugen ist.

    Edit: Das einrücken ist simpel, nach einem : muss der dazugehörige code einen <tab> nach rechts

    Code
    #normaler code
    if bla bla:
        #1 Einrückung
        if blub blub:
            #2 Einrückung
    #normaler code

    Wobei das 2. If im ersten if abgearbeitet wird.

  • Also dann wird das wohl an der Variable "status" gelegen haben.

    Das mit den Leerzeichen ist echt wichtig, damit Python überhaupt die Reihenfolge versteht, die Du von ihm verlangst. Ohne konsequente Leerzeichen kannst Du das Programmieren direkt an den Nagel hängen. Der Computer ist immer nur so schlau wie der Typ, der davor sitzt.
    Daher ist es auch genau so wichtig den Problemcode hier EXAKT so zu posten, wie der bei Dir auf dem Bildschirm erscheint. One solchä Rägäln kahn äs nihmahlz zuh ainer gählungänehn comunickahtion ckommmän. :D

    Nutze für Python am besten den Editor "Idle". Der ist schon vorinstalliert und erledigt auch oft die korrekten Abstände. Dafür kann man bei den Settings verschiedene Abstände einstellen. Zur besseren lesbarkeit hat sich wohl allgemein ein vielfaches von 4 durchgesetzt. Also 4 Leerzeichen, 8 Leerzeichen, 12, 16,...
    So kann man gut Code vergleichen oder Codeteile einfügen, ohne alles vorher bearbeiten zu müssen.

    Ist aber recht schnell zu lernen: Alles was eingerückt ist, ist abhängig von der letzten nicht-eingerückten Zeile.
    Also quasi wie eine Überschrift.

    Zurück zum Thema:
    Jetzt müsstest Du mal verraten was Du genau vorhast. Ist ein Schalter oder ein Taster angeschlossen? Was macht das externe Programm? Was soll genau passieren?
    Das mit dem killall ist mir in der Eile gar nicht aufgefallen. Der Befehl muss natürlich in os.system eingebettet werden:

    Code
    os.system("killall -v /bin/test")

    Perlchamp: Sorry??? Is nich!!! :D (nur spass) Hast Dich doch super eingebracht. manchmal kommt man auf die einfachsten Sachen nicht. Auch wenns jetzt nicht das Problem war, war die Frage nach der Pythonversion schon sehr wichtig. Ich nutze auch Python 2.x, weil mir bei 3 schon einige Nickeligkeiten aufgefallen sind. Der "Vorteil" das es z.B. kein raw_input gibt, ist für mich nicht wirklich ein Vorteil... Sonst wären mir auch noch keine "Verbesserungen" bekannt, die mich zum umsatteln bringen würden.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

  • Hallo,

    ich bin kein Python Coder und kann daher wenig zur Diskussion beitragen.

    Mir erscheint aber das verwendete killall etwas bizarr oder zumindest unorthodox.
    Ich kenne killall nur als zusätzliches Hilfskommando aus dem psmisc RPM bzw. Paket meiner bevorzugten Distro.
    Als Syscall der libc ist mir killall bisher noch nicht untergekommen, sondern nur kill, um Signale an Prozesse zu schicken.
    Aber selbst in einem Shellskript mache ich fast immer einen grossen Bogen um killall,
    denn das kommt mir vor wie das Abfeuern einer Schrotflinte, auf alles, was einem Muster entspricht,
    mit der latenten Gefahr von Kollateralschäden.

    In Perl z.B. macht man sowas mit einem gezielten kill an die PID des betreffenden Prozesses.
    Damit man nicht erst mehr oder weniger aufwendig die Proc Table parsen muss (was natürlich auch möglich wäre),
    ist in der perlipc die übliche klassische Prozedur auf Unix Systemen, dass man den zu startenden Prozess mit dem Syscall fork forkt,
    also zunächst eine exakte Kopie (inkl. Environment, Filehandles etc.) des laufenden Prozesses macht.
    Der forkende Parent Process bekommt als Rückgabewert des fork Calls die PID des geforkten Child Procs.
    Letzterer erhält 0 als Rückgabewert.
    Somit kann man Parent und Child Proc einfach durch eine entsprechende if Abfrage im selben Code implemetieren.
    In den if Block des Child Proc schreibt man einen exec Call, dem man Pfad und ggf. Argumente des Executable übergibt.
    Da ein exec() - anders als ein system() - nicht wieder zurückkehrt, war das schon alles, was im Child Block zu coden ist.
    Das einzige Statement, das einem exec folgen darf, wäre evtl. noch ein exit.
    Der Rest, inklusive der IPC zum Child Proc via kill, wird dann im restlichen Parent Proc Code implementiert.

    Ich kann nicht glauben, dass dieses Verfahren nicht auch in Python möglich und sinnvoll wäre.

    Wenn ich mal pydoc os aufrufe, kann ich immerhin sehen, dass dort auch eine fork, diverse exec* und eine kill Methode auftauchen.
    Somit ist eigentlich alles vorhanden, was ich auch von Perl her kenne.

    Gruß
    Ralph

    Einmal editiert, zuletzt von Life_of_Pi (4. Mai 2014 um 23:09)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!