等到远程机器上的任务通过 Python 完成

Wait until task is completed on Remote Machine through Python

我正在 Ubuntu python 中编写程序。在该程序中,我试图在连接到网络的远程计算机 (RaspberryPi) 上完成任务 "Delete a File" 后打印一条消息。

但在实际操作中,打印命令不会等到远程机器上的任务完成。

谁能指导我该怎么做? 我的编码如下

import paramiko

# Connection with remote machine
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.2.34', username='pi', password='raspberry')

filename   = 'fahad.txt'
filedelete ='rm ' + filename
stdin, stdout, stderr = client.exec_command(filedelete)
print ("File Deleted")
client.close()

这确实是 paramiko SSH exec_command(shell script) returns before completion 的重复,但那里的答案不是很详细。所以...

如您所见,exec_command 是一个 非阻塞 调用。因此,您必须使用以下任一方法等待远程命令完成:

在您的特定情况下,您需要后者:

stdin, stdout, stderr = client.exec_command(filedelete)  # Non-blocking call
exit_status = stdout.channel.recv_exit_status()          # Blocking call
if exit_status == 0:
    print ("File Deleted")
else:
    print("Error", exit_status)
client.close()

除了按照 Sylvian Leroux 的建议进行:

如果您的命令涉及 运行ning 一个 bash 脚本,该脚本需要在 paramiko 关闭 ssh 会话后保持 运行ning(每次您发送命令时都会发生这种情况)使用:

nohup ./my_bash_script.sh >/dev/null 2>&1.

nohup 告诉系统这个进程应该忽略在 ssh 会话关闭时接收到的“挂断”信号。

>/dev/null 2>&1 重定向输出。这是必要的,因为在某些情况下,在收到输出之前,控制权不会交还给您的 python 脚本。

运行 像“stress”和“vlc”这样的命令行应用程序,并在 return 之后 运行ning 保留它们,我找到的唯一解决方案是把你的命令在 bash 脚本中后跟 &&>/dev/null 然后使用我在上一段中提到的方法用 paramiko 调用那个 bash 脚本。

这似乎有点“hacky”,但这是我经过几天搜索后找到的唯一方法。