staging.inyokaproject.org

[Python3] - Skript aus Skript starten mit 5 Minuten Zeitversatz

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

halloICKEbins

Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Mahlzeit,

ich habe ein Python3-Skript 1, welches ein Python3-Skript 2 starten soll mit einem Zeitversatz von 5 Minuten. Dabei soll sich das erste Skript aber schließen und das zweite Skript vom System oder anders aufgerufen werden!

Geht das?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ja, z.B. über at oder einem transienten Systemd-Timer (vgl. Systemd/Timers).

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Aber wie gebe ich es z.B. mittels subprozess als python3-Syntax an. Ich befinde mich zu dieser Zeit bereits in meinem Skript 1.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Du brauchst doch nur in Deinem ersten Skript so lange zu schlafen und dann via exec (nehme mal an, das gibt es in Python) mit dem zweiten überlagern.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

halloICKEbins schrieb:

Aber wie gebe ich es z.B. mittels subprozess als python3-Syntax an. Ich befinde mich zu dieser Zeit bereits in meinem Skript 1.

Zum Beispiel so mit Benutzerrechten (wenn das Skript als root läuft das --user Argument für systemd-run entfernen):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python3
import subprocess
import shlex

def run_later_with_at(cmd_to_run_later, minutes):
    at_cmd = ["/usr/bin/at", "now", "+", str(minutes), "min"]
    at_proc = subprocess.run(at_cmd,
            input=cmd_to_run_later,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True)
    return at_proc

def run_later_with_systemd(cmd_to_run_later, minutes):
    cmd = shlex.split(cmd_to_run_later)
    systemd_cmd = ["/usr/bin/systemd-run", "--no-ask-password", "--user", "--on-active={}".format(minutes * 60)]
    systemd_cmd.extend(cmd)
    systemd_proc = subprocess.run(systemd_cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True)
    return systemd_proc

if __name__ == '__main__':
    print(run_later_with_at("/usr/bin/touch /tmp/ran_later_at.txt", 5))
    print(run_later_with_systemd("/usr/bin/touch /tmp/ran_later_systemd.txt", 5))

Die Frage ist halt, was man erreichen will - natürlich könnte man mit asyncio arbeiten, das originale Skript forken lassen und den geforkten Prozess schlafen lassen oder am Ende des ersten Skript so lange schlafen, bis man das zweite Skript ausführen will, aber dann kann man den Start des zweiten Skripts nicht über den at-Spooler bzw. das Init-System kontrollieren.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

muss das Skript 1 irgendwas an Skript 2 übergeben? Wenn nein muss das Skript 1 von Skript 2 nichts wissen und du kannst mit systemd Timer Units arbeiten.

Was ist denn der Sinn das ganzen bzw. das Ziel?

Gruß, noisefloor

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Die Übergabe der Werte mache ich per Datenbank.

Ziel des Ganzen:

Im Skript 1 werden SSH-Verbindungen ausgeführt - gibt es hier ein Verbindungsproblem, soll Skript 2 es 5 Minuten später nochmal probieren.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

das klingt jetzt aber nicht so, als bräuchtest du 2 Skripte... Skript 1 kann doch das ganze genau so gut nach 5 Minuten nochmal probieren?

Gruß, noisefloor

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Theoretisch ja...ist für mich aber leichter es in 2 Skripten umzusetzen...für den Anfang zumindestens!

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

äh... nein?!

Pseudo-Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import time

def connect_via_ssh():
    #do something
    if do_something_is_successfull:
        return True
    else:
        return False

result = connect_via_ssh()
if not result:
    time.sleep(300)
    connect_via_ssh()

Gruß, noisefloor

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

halloICKEbins schrieb:

Dabei soll sich das erste Skript aber schließen und das zweite Skript vom System oder anders aufgerufen werden!

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

liest du eigentlich deine eigenen Antworten? Genau danach habe ich gefragt - und du hast gesagt, dass theoretisch auch 1 Skript geht, aber 2 für die einfacher sind.

Also: _müssen_ es 2 sein - ja oder nein? Wenn ja, warum? Und wie müssen / sollen die interagieren?

Es wäre vielleicht mal gut, wenn du dir einfach mal die Zeit nimmst und _ausführlich_ (also in mehr als 2 Halbsätzen) beschreibst, was das _genau_ Ziel des ganzen ist, was Skript 2 kann, was Skript 1 nicht kann, die Skripte ggf. poste etc. - das volle Programm halt. Mit den dürftigen Informationströpfchen deinerseits kommt hier keiner inkl. dir wirklich weiter.

Gruß, noisefloor

Antworten |