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!
Konsolen Befehl in laufenden Skript ausführen.
Hier mal ein Beispiel, wie man es vielleicht machen könnte, wenn man globalen Zustand vermeiden will:
Vielleicht gibt es auch einen anderen/gängigeren Weg; das würde mich interessieren.
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
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()