Script starten und stoppen mit Python

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
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK, was wäre das dann?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

prozess = subprocess.Popen(...)
prozess.kill()
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Solange es nicht kill -9 ist, bleibt es doch recht freundlich ... 8)
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: `Popen.kill()` *ist* ``kill -9``. Docstring: „Kill the process with SIGKILL“.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mit 'prozess.kill()' wird mein 'except' nicht ausgeführt.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Ja das ist klar. Nochmal: Du brauchst `send_signal()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Was muss als Parameter angegeben werden?
In https://docs.python.org/3/library/subpr ... onstructor konnte ich nichts finden.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@egon11: das Modul wird ja auch nur gebraucht, um die richtige Konstante zu benutzen: signal.SIGINT.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ach so, so ist das gemeint, habe es getestet und es funktioniert. Vielen dank.
Antworten