Konsolen Befehl in laufenden Skript ausführen.

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
Koque
User
Beiträge: 5
Registriert: Samstag 9. Mai 2020, 11:36

Hey,
ich frage mich, ob und wie es möglich ist mit einem Konsolenbefehl mit einem bereits als Dienst laufendes Skript zu interagieren.
Z.B. möchte ich, dass der Dienst solange checkt ob ein Screen existiert bis ich über die Konsole den Befehl gebe($ myprogram checkingScreen XY off), dass er damit aufhören soll.

Ich nutze Ubuntu, die Befehle realisiere ich mit dem Click Modul und füge das Skript myprogram als auszuführende Datei zum PATH.

Also meine Ansatz ist, dass ich das Skript myservice mit systemd als Dienst beim booten automatisch starte und während Variable a in myservice True ist checkt ob ein bestimmter Screen existiert. Mit dem Konsolenbefehl 'myprogram checkingScreen XY off' wird dann mit den mitgegeben Argumenten das Skript myprogram ausführt, welches während myservice läuft die Variable a in myservice ändert und so die Überwachung des Screens beendet.

Ist das möglich oder soll ich einfach eine Textdatei mit 'Überwachen = True' erstellen und myservice liest die Datei einfach dauernd und irgendwann ändert myprogram Überwachung auf False?

Vielen Dank im Voraus!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

So etwas kann man in Unix über Signale lösen.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Hier mal ein Beispiel, wie man es vielleicht machen könnte, wenn man globalen Zustand vermeiden will:

Code: Alles auswählen

#!/usr/bin/env python3
import os
import signal
from time import sleep


class Checker:
    def __init__(self):
        signal.signal(signal.SIGUSR1, self.handler)
        self.running = True

    def handler(self, signal, stack):
        print('Stop')
        self.running = False

    def loop(self):
        print('Start')
        while self.running:
            print('Ping.'')
            sleep(5)


def main():
    print('PID:', os.getpid())
    checker = Checker()
    checker.loop()

if __name__ == '__main__':
    main()

Code: Alles auswählen

$ ./signal_demo.py  
PID: 33744
Start
Ping.
Ping.
Ping.
Ping.
Ping.
Ping.
Stop

$ kill -SIGUSR1 33744
Vielleicht gibt es auch einen anderen/gängigeren Weg; das würde mich interessieren.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Klasse ist etwas übertrieben:

Code: Alles auswählen

#!/usr/bin/env python3
import os
import signal
from threading import Event
from time import sleep

def register_event(signal_number):
    event = Event()
    signal.signal(signal_number, lambda *args: event.set)
    return event

def main()
    print('PID:', os.getpid())
    aborted = register_event(signal.SIGUSR1)
    while not aborted.is_set():
        print('Ping.')
        sleep(5)
    print('Finished')

if __name__ == '__main__':
    main()
Antworten