2016-10-17 3 views
1

Ich starte einen Remote-Computer über Python neu, da es ein Neustart ist, wird die aktuelle SSH-Sitzung beendet. Die Anfrage wird nicht zurückgegeben. Ich bin nicht an der Rückkehr interessiert.Remote-Befehl gibt keine Python zurück

os.command ('sshpass -p Kennwort ssh user @ host Neustart')

Der Code, um den Neustart durchführt, aber die aktuelle Sitzung wird getötet und das Skript nie zurückgibt.

Ich kann eine Async tun und ignorieren Sie einfach den Thread, andere einfache Optionen?

+0

Afaik, es gibt kein 'os.command'; was nennst du eigentlich, 'os.system' vielleicht? Hast du es stattdessen mit 'subprocess.check_call' versucht? – Evert

+0

Können Sie näher erläutern, was Sie erwarten? Was meinst du mit "die Anfrage wird nicht zurückgegeben"? – Tolli

Antwort

1

Ich bin überrascht, dass das Skript nicht zurückkehrt. Die Verbindung sollte vor dem Neustart von der Fernbedienung zurückgesetzt werden. Sie können den Prozess asyc ausführen, das eine Problem ist, dass Subprozesse, die nicht von ihren Eltern aufgeräumt wurden, zu Zombies werden (nehmen immer noch Platz in der Prozesstabelle ein). Sie können einen Timer hinzufügen, um dem Skript Zeit für seine schmutzige Arbeit zu geben und es dann im Hintergrund zu bereinigen.

Beachten Sie, dass ich diesen Befehl auf eine Liste von Parametern umgeschaltet und die Einstellung shell=True übersprungen habe. Es bedeutet nur, dass kein Zwischen-Shell-Prozess ausgeführt wird.

import sys 
import subprocess as subp 
import threading 
import timing 

def kill_process(proc): 
    # kill process if alive 
    if proc.poll() is None: 
     proc.kill() 
     time.sleep(.1) 
     if proc.poll() is None: 
      sys.stderr.write("Proc won't die\n") 
      return 
    # clean up dead process 
    proc.wait() 

proc = subp.Popen(['sshpass', '-p', password, 'ssh', '[email protected]', 'reboot') 
threading.Timer(5, kill_process, args=(proc,)) 

# continue on your busy day...