Seite 1 von 1

Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 17:30
von egon11
Ich möchte ein Script mit einen Python Script starten, und wieder stoppen. Dabei habe ich mir folgendes zusammen gebaut.

Code: Alles auswählen

def start_stop():
    befehl1 = ['ps', '-aux']
    befehl2 = ['grep', 'ubung.py']
    befehl3 = ['grep', '-v', 'grep']

    subprocess.Popen(['/usr/bin/python3', '/home/matze/Schreibtisch/ubung.py'])
    time.sleep(15)

    command1 = subprocess.Popen(befehl1,stdout=subprocess.PIPE)
    command2 = subprocess.Popen(befehl2, stdin=command1.stdout,stdout=subprocess.PIPE)
    command3 = subprocess.Popen(befehl3, stdin=command2.stdout,stdout=subprocess.PIPE)
    ergebnis = (command3.stdout.readline().decode("utf-8").split()[1])

    beenden = ['kill', '-s', 'SIGINT',ergebnis]
    subprocess.Popen(beenden)
Wäre das so richtig?
Funktioniert tut es.

Es soll ein Python Script mit einer endlos Schleife und eingebauten 'try' beenden.
Heißt beim 'kill' wird 'except' ausgeführt und durch 'break' das ordentlich beendet.

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 17:48
von __deets__
subprocess.Popen liefert dir doch ein Popen-Objekt zurück, auf dem du einfach kill aufrufen kannst, statt diesen Wahnsinn aus drei anderen aufrufen zu machen.

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 17:54
von egon11
OK, was wäre das dann?

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 18:00
von __deets__
prozess = subprocess.Popen(...)
prozess.kill()

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 18:48
von __blackjack__
Ja naja, erstmal bitte nicht `kill()` sondern `terminate()` — seid freundlicher zu euren Prozessen. 😍

Beziehungsweise soll ja weder SIGKILL noch SIGTERM sondern SIGINT gesendet werden. Dazu hat `Popen` die `send_signal()`-Methode und das `signal`-Modul liefert die passende Konstante dazu.

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 18:57
von kbr
Solange es nicht kill -9 ist, bleibt es doch recht freundlich ... 8)

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 19:06
von __blackjack__
@kbr: `Popen.kill()` *ist* ``kill -9``. Docstring: „Kill the process with SIGKILL“.

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 19:11
von egon11
Mit 'prozess.kill()' wird mein 'except' nicht ausgeführt.

Re: Script starten und stoppen mit Python

Verfasst: Dienstag 14. April 2020, 19:45
von __blackjack__
@egon11: Ja das ist klar. Nochmal: Du brauchst `send_signal()`.

Re: Script starten und stoppen mit Python

Verfasst: Mittwoch 15. April 2020, 04:59
von egon11
Was muss als Parameter angegeben werden?
In https://docs.python.org/3/library/subpr ... onstructor konnte ich nichts finden.

Re: Script starten und stoppen mit Python

Verfasst: Mittwoch 15. April 2020, 07:05
von nezzcarth
Na ja, in dem Fall musst du in der Dokumentation, also den Man-pages deines Betriebssystems, nachsehen (signal(7)), oder notfalls bei Wikipedia. Jedes Signal hat eine Nummer (SIGKILL z.B. 9), die du als Parameter an 'send_signal' übergeben musst. Lesbarer ist es aber, die Konstanten aus dem Signal-Modul zu verwenden. Signale sind ein Konzept des Betriebssystems; wenn du sie verwenden möchtest, bietet es sich an, sich da zumindest grob einzulesen.

Re: Script starten und stoppen mit Python

Verfasst: Mittwoch 15. April 2020, 19:53
von egon11
Das Signal-Modul scheint glaube nicht für meine Bedürfnisse zu sein.

Denn ich rufe ja eine Script außerhalb des Scriptes auf.

Würde auch mit: 'send_signal(2)' gehen.

Re: Script starten und stoppen mit Python

Verfasst: Mittwoch 15. April 2020, 20:02
von Sirius3
@egon11: das Modul wird ja auch nur gebraucht, um die richtige Konstante zu benutzen: signal.SIGINT.

Re: Script starten und stoppen mit Python

Verfasst: Mittwoch 15. April 2020, 22:05
von __blackjack__
@egon11: Bei Deinem ursprünglichen externen ``kill -s SIGINT`` könntest Du ja auch ``kill -s 2`` schreiben, das ist nur nicht so verständlich. Ist bei `send_signal()` genau so. ``send_signal(signal.SIGINT)`` ist verständlicher als ``send_signal(2)``. Wenn der Leser nicht weiss was die 2 bedeutet ist das schwieriger heraus zu finden als wenn der Leser `signal.SIGINT` nicht kennt. Denn `signal.SIGINT` findet man schnell in der Python-Dokumentation. Und ich wage zu behaupten das mehr Programmierer den Signalnamen SIGINT kennen, als solche die wissen, dass die Konstante dazu 2 ist.

Re: Script starten und stoppen mit Python

Verfasst: Donnerstag 16. April 2020, 04:45
von egon11
Ach so, so ist das gemeint, habe es getestet und es funktioniert. Vielen dank.