2010-07-09 5 views
12

Ich starte ein Shell-Skript von einem Remote-Linux-Rechner mit Paramiko. Das Shell-Skript wird gestartet und führt den Befehl make -j8 aus. Der Befehl exec_comm gibt jedoch vor dem Abschluss des make zurück.paramiko SSH exec_command (Shell-Skript) gibt vor der Fertigstellung

Wenn ich das Skript auf dem lokalen Rechner starte, wird es korrekt ausgeführt.

Kann mir jemand dieses Verhalten erklären?

Antwort

21

Sie müssen auf den Abschluss der Anwendung warten, exec_command ist kein blockierender Anruf.

print now(), "before call" 
stdin, stdout, sterr = ssh.exec_command("sleep(10)") 
print now(), "after call" 
channel = stdout.channel 
print now(), "before status" 
status = channel.recv_exit_status() 
print now(), "after status" 
+2

Was ist der Zweck dieser jetzt() 's? Es sieht so aus, als würden sie alle sehr schnell hintereinander rennen? Wollen Sie sagen, dass Sie warten müssen, bis die Anwendung beendet ist? Sie brauchen eine 'while not channel.recv_exit_status():' wait loop? Wenn ja, sobald recv_exit_status() True zurückgibt, ist garantiert, dass stdout.channel.recv_ready() True ist, wenn jemals Daten auf stdout sein werden? Es scheint, dass dies manchmal nicht der Fall ist. –

+1

Dieses Verhalten ist dokumentiert [hier] (http://paramiko-docs.readthedocs.org/en/latest/api/channel.html#paramiko.channel.Channel.recv_exit_status) – miraculixx

+0

seltsam, mit stdout.channel.recv_exit_status() blockiert meinen Code für immer –

Verwandte Themen