Autostart systemd

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Danke für das Beispiel aber das ist ja in einem Python Programm direkt implementiert.

    Was ich nicht verstehe ist, wie ich das sauber in dem systemd Service mit ExecStop durchführe.

    So wie ich die Erklärung von peuler in #15 verstehe, kannst Du entweder bei ExecStop ein Kommando, Script o.ä. angeben, welches Dein Programm sauber anhält.

    Oder Du sorgst direkt in Deinem Programm dafür, dass es spätestens beim Empfang von SIGTERM selber sauber stoppt.

    Das SIGTERM kommt ja beim Herunterfahren des OS.

    Vermutlich genügt also der Einbau o.g. Funktionalität in dein autoreifeschrank.py


    Ergänzung:

    (aus man systemd.service)



    und aus man systemd.kill :

    Edited 2 times, last by simonz: Info zu systemd.service und systemd.kill ergänzt ().

  • Vermutlich genügt also der Einbau o.g. Funktionalität in dein autoreifeschrank.py

    Und was passiert wenn der TE nichts macht? Die default-Einstellung ist:

    Code
    KillSignal=15
    FinalKillSignal=9

    @TE:

    Wie ist die Ausgabe von:

    Code
    systemctl show AutoReifeschrank | grep -iE 'killsignal|killmode|sigkill'

    ?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Und was passiert wenn der TE nichts macht?

    Vermutlich killt systemd dann das Script gnadenlos mit -9.

    Also genau das, was peuler zu bedenken gab.


    Und deshalb habe ich die Möglichkeiten aus meiner (bzgl. systemd) Anfänger-Sicht beschrieben.


    Oder habe ich Deine Frage nicht richtig verstanden?

  • Vermutlich killt systemd dann das Script gnadenlos mit -9.

    Warum meinst Du, dass es -9 (SIGKILL) und nicht -15 (SIGTERM), ist?

    Schau mal in der manpage für systemd.kill nach.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Neee, nee, dieses Systemd lässt mir doch keine Ruhe!


    Ich bitte um also Aufklärung...



    Ein simples Testscript ~/bin/myscript.py

    Python
    #!/usr/bin/env python3
    
    from time import sleep
    
    # simuliert das eigentliche Programm:
    for i in range(200):
        print(i)
        i += 1
        sleep(2)


    mit folgender Standard-Konfiguration in /etc/systemd/system/myscript.service


    ergibt nach einem

    Bash
    sudo systemctl start myscript.service
    # ein paar Sekunden warten
    sudo systemctl stop myscript.service
    sudo systemctl status myscript.service


    das erwartete Ergebnis:

    Es wird beim Stoppen also einfach von systemd beendet.


    Wenn das Python-Script sich aber sauber(er) beenden soll, kann man das mit peuler 's Vorschlag eines Signals machen,

    z.B. so (meine Interpretation):


    Dann kommt raus:


    Also wird im Script der Teil zum kontrollierten Stoppen ausgeführt. Super.


    Ist das so eurer Meinung nach sauber gedacht/gemacht?


    Ein ExecStop ist zumindest bei so einer Konstruktion doch nicht nötig, oder?

  • simonz


    Mein kleines Testskript:


    Führe das mal direkt im Terminal aus und beende das mit STRG + C!


    Funktioniert nicht, weil SIGINT hier ignoriert wird. (Zeile #11) Abschießen kannst Du das Skript übrigens nun in einem weiteren Terminal mit pkill -f myscript.py. ;)


    Testen kannst Du das nun auch per Systemd Service Unit. Dort wird das Skript allerdings beendet, weil hier SIGTERM gesendet wird und nicht SIGINT.


    - - -


    So und nun mach mal was ganz verrücktes und ändere Zeile #11 SIGINT in SIGTERM und stoppe da mal den Service. Hab aber etwas Geduld, das dauert einen Moment und sieh Dir dann den Status an.


    Du wirst feststellen, dass Systemd versucht hat das Skript zu beenden (15) und weil das nicht funktionieren kann wurde das final gekillt (9).


    Ich bitte um also Aufklärung...

    War das Aufklärung genug? :lol:

  • Ok, ich gehe davon aus, dass Du das mal getestet hast. ;) Für alle anderen hier mal noch die Ausgabe:


    Mein Skript heist übrigens signaltest.py, aber das nur zur Info.

  • Abschießen kannst Du das Skript übrigens nun in einem weiteren Terminal mit pkill -f myscript.py.


    Oder in demselben Terminal (falls man mal nur eines hat):


    Mit Strg-Z den Prozess anhalten und dann endgültig beenden mit:

    Code
    kill -9 %%

    "%%" referenziert den aktuellen Job (in diesem Fall den gerade angehaltenen).

  • So, nun habe ich mich endlich einmal etwas mehr mit systemd beschäftigt.

    Bisher hatte ich für eigene Dinge immer einen Bogen darum gemacht.


    Die diversen Tipps von hyle, rpi444, peuler, u.a. habe ich wohl weitestgehend kapiert...?! Danke nochmal!


    Ergebnis:

    Ich habe heute meine /etc/rc.locals komplett geleert und die diversen Automatiken per systemd implementiert.


    Unglaublich, es scheint immer noch alles zu funktionieren! ^^

  • @TE:

    Wie ist die Ausgabe von:

    Code
    systemctl show AutoReifeschrank | grep -iE 'killsignal|killmode|sigkill'

    ?

    Das Ergebnis ist

    Code
    KillMode=control-group
    KillSignal=15
    RestartKillSignal=15
    FinalKillSignal=9
    SendSIGKILL=yes


    Ich habe mir auch eure Beiträge ein paar mal durchgelesen aber ich kann mir keinen Reim darauf machen was ich nun machen soll

    Ist es ok wenn ich diesen Code in mein Program einbaue

    Code
    def handler(signum, frame):    print('Signal handler called with signal', signum)    print('sauberes Beenden angestartet....')    # ... was immer sinnvoll ist im aktuellen Anwendungsfall    sys.exit(0)
    
    signal.signal(signal.SIGTERM, handler)

    oder ist der von hyle der Richtige?

    Code
    ef main():    i = 0    while True:        print("test", i)        signal.signal(signal.SIGINT, receiveSignal)        i += 1        time.sleep(1)
    
    
    def receiveSignal(signalNumber, frame):    print('Received:', signalNumber)    return
    
    
    if __name__ == "__main__":    try:        main()
        except KeyboardInterrupt:        print("    Abbruch")
        finally:        print("    Bye!")

    Ich habe es auch mit ExecStop=pkill Reifeschrank.py probiert aber da kommt folgendes wenn ich den Prozess stoppe

    Ich stehe auf dem Schlauch und ich hoffe das mir jemand einen gewaltigen Schubser geben kann. :wallbash:


    SG Stefan

  • Das Ergebnis ist

    Code
    KillMode=control-group
    KillSignal=15
    RestartKillSignal=15
    FinalKillSignal=9
    SendSIGKILL=yes


    Ich stehe auf dem Schlauch und ich hoffe ...

    Was Du evtl. machen kannst ist, keine Zeile mit "ExecStop=" und wenn Du keinesfalls Probleme mit "systemctl restart ..." haben willst, KillMode ändern in:

    Code
    KillMode=mixed
    Quote

    ... service will not restart if processes from prior services exist within the control group.

    "mixed" killt immer.

    Quelle: manpage von systemd.kill und eigene Erfahrung.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden