等到远程机器上的任务通过 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
是一个 非阻塞 调用。因此,您必须使用以下任一方法等待远程命令完成:
Channel.exit_status_ready
如果你想对命令完成进行非阻塞检查(即:池化)
Channel.recv_exit_status
如果您想阻塞直到命令完成(并返回退出状态——退出状态为 0 表示正常完成)。
在您的特定情况下,您需要后者:
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”,但这是我经过几天搜索后找到的唯一方法。
我正在 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
是一个 非阻塞 调用。因此,您必须使用以下任一方法等待远程命令完成:
Channel.exit_status_ready
如果你想对命令完成进行非阻塞检查(即:池化)Channel.recv_exit_status
如果您想阻塞直到命令完成(并返回退出状态——退出状态为 0 表示正常完成)。
在您的特定情况下,您需要后者:
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”,但这是我经过几天搜索后找到的唯一方法。