Anzeige:
Ergebnis 1 bis 4 von 4

Thema: python3 subprocess wird nicht beendet

  1. #1
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.254

    python3 subprocess wird nicht beendet

    Hi,

    wieder mal ein bloedes Python Problem

    Code:
    subprocess.Popen([sftp_path, '-i', ssh_id_key, sftp_connect + ':/files/om_db_output_' + YesterDayDate, tmp_path + '/om_db_output.log'])
    Code:
    In [22]: subprocess.Popen([sftp_path, '-i', ssh_id_key, sftp_connect + ':/files/om_db_output_' + YesterDayDate, tmp_path + '/om_db_output.log'])
    Out[22]: <subprocess.Popen at 0x7f54e7172630>
    
    In [23]: Connected to TARGETSERVER.
    Fetching /files/om_db_output_2016-12-28 to /opt/ui/data/montool/tool_tmp/soccer_oms/om_db_output.log
    /files/om_db_output_2016-12-28                                                                                                                             100%  396KB 395.6KB/s   00:00    
    ^C
    KeyboardInterrupt
    Der subprocess holt die Datei und schreibt diese erfolgreich Lokal, aber dann wird der nicht beendet, das Beispiel ist aus "ipython3"

    Gruss Stefan
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  2. #2
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Nun ich denke du hast mehrere Optionen, zum einen kannst du subprocess.run verwenden, dem kann man sagen, dass der Befehl so und so schnell beendet werden muss
    Code:
    subprocess.Popen([sftp_path, '-i', ssh_id_key, sftp_connect + ':/files/om_db_output_' + YesterDayDate, tmp_path + '/om_db_output.log'],  timeout=5)
    The timeout argument is passed to Popen.communicate(). If the timeout expires, the child process will be killed and waited for. The TimeoutExpired exception will be re-raised after the child process has terminated.
    Die anderen sind, wie da ja auch steht, subprocess.Popen.communicate zu verwenden, alternative ginge auch subprocess.Popen.wait.

    Oder du nutzt subprocess.Popen.poll und implementierst das mit dem Timeout selber. So oder so, musst du halt sicherstellen, was mit dem Prozess los ist und ob er in endlicher Zeit seine Aufgabe erfüllt halt, zB etwa so:
    Code:
    """
    The child process is not killed if the timeout expires, so in order to cleanup properly a well-behaved application should kill the child process and finish communication:
    """
    proc = subprocess.Popen([sftp_path, '-i', ssh_id_key, sftp_connect + ':/files/om_db_output_' + YesterDayDate, tmp_path + '/om_db_output.log'])
    try:
        outs, errs = proc.communicate(timeout=180)
    except TimeoutExpired:
        proc.kill()
        outs, errs = proc.communicate()
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  3. #3
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.254
    Gefunden, nachdem ich statt Popen call verwendet habe, wurder der subprocess beendet, wobei ich gerade nicht verstehe warum
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  4. #4
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Das ist relativ einfach zu erklären.
    Blick auf die Doku zu subprocess.call:
    Run the command described by args. Wait for command to complete, then return the returncode attribute.

    This is equivalent to:

    Code:
    run(...).returncode
    (except that the input and check parameters are not supported)
    Ok, sehen wir uns als mal subprocess.run an:
    Run the command described by args. Wait for command to complete, then return a CompletedProcess instance.
    ...
    Das Problem ist, wenn der Befehl kein Ende findet, hast du ein Deadlock erzeugt, diese Option will man aber eigentlich nie haben, also solltest du ein Timeout vorgeben, so dass dein Programm nicht versehentlich stecken bleiben kann.


    [edit]Oder um es klar zu sagen, in deinem "ersten Versuch" hast du Sig Term an den Hauptprozess geschickt, der hat es aber nicht an den Sub Process weitergereicht, das wurde gemeldet. Sauberst Lösung für diese Art von Problem sind eigene Signal Hanlder - https://docs.python.org/3/library/signal.html#example
    Aber obacht, macht den Code schnell ziemlich schwierig...
    Geändert von nopes (29.12.16 um 12:13 Uhr)
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

Ähnliche Themen

  1. Python3 int oder nicht int fu
    Von Huhn Hur Tu im Forum Linux als Server
    Antworten: 13
    Letzter Beitrag: 02.12.16, 23:59
  2. Kommando wird beendet wenn Terminal geschlossen wird
    Von wotuzu17 im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 04.06.11, 11:51
  3. Antworten: 4
    Letzter Beitrag: 18.06.06, 15:18
  4. Antworten: 2
    Letzter Beitrag: 30.08.04, 08:17
  5. ssh Sitzung wird nach reboot nicht beendet
    Von Slurm im Forum Linux als Server
    Antworten: 2
    Letzter Beitrag: 02.08.04, 09:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •