Seite 1 von 1

Konsolen Befehl in laufenden Skript ausführen.

Verfasst: Mittwoch 29. Juli 2020, 19:11
von Koque
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!

Re: Konsolen Befehl in laufenden Skript ausführen.

Verfasst: Mittwoch 29. Juli 2020, 19:37
von Sirius3
So etwas kann man in Unix über Signale lösen.

Re: Konsolen Befehl in laufenden Skript ausführen.

Verfasst: Mittwoch 29. Juli 2020, 20:04
von nezzcarth
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.

Re: Konsolen Befehl in laufenden Skript ausführen.

Verfasst: Mittwoch 29. Juli 2020, 20:15
von Sirius3
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()