使用Python Paramiko在后台运行远程SSH服务器的进程

9

我发现使用Paramiko在远程SSH服务器上后台运行进程很困难。 我使用了以下命令:

stdin, stdout, stderr = ssh.exec_command('executefile.py &') 

我发现并没有找到正在运行的executefile.py进程。

于是我尝试了另外一种方式,包含反斜杠:

stdin, stdout, stderr = ssh.exec_command('executefile.py \&') 

这种方法行得通。在机器上有一个实例,但并不意外,它没有在后台运行。我可以知道它没有在后台运行,因为当代码在此行之后卡住时,我就会知道。它是:

all_inf = stdout.readlines()

现在代码无法继续执行,除非脚本的进程被杀死。 我正在学习Paramiko,感谢您给予的任何帮助。
5个回答

25

我尝试了这里描述的所有方法和这里,但都没有成功,最后意识到需要使用通道而不是直接使用SSHClient来调用exec_command这在后台不起作用):

client = paramiko.SSHClient()
client.connect(ip_address, username='root', pkey=paramiko_key, timeout=5)
client.exec_command('python script.py > /dev/null 2>&1 &')

你应该创建并使用一个通道,这将在后台运行:
client = paramiko.SSHClient()
client.connect(ip_address, username='root', pkey=paramiko_key, timeout=5)
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command('python script.py > /dev/null 2>&1 &')

因此,nohupdtachscreen等实际上并不是必需的。


2
只是提供信息,你甚至不需要 & - Wyrmwood
对我来说,第一段代码也可以工作。实际上,SSHClient.exec_command 内部执行的是第二段代码相同的操作。唯一的区别在于它返回输出流。也许在某些情况下这可能会有所不同。关闭它们可能会解决这种差异。 - Martin Prikryl
不幸的是,那对我不起作用 :( 在关闭客户端后,远程进程也会退出 :( - Ladenkov Vladislav
我可以在嵌入式系统中使用,但不能在Linux PC上使用。使用invoke_shell来解决问题。 - ching-yu

5

您可以尝试以下方法:

stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &') 

同步和异步SSH相同 - gzerone

3

exec_command并不是在交互式shell中执行命令,所以“在后台运行进程”并没有实际意义。

如果你真的想这样做,你可以使用命令nohup启动你的进程,并在会话退出时保持它的运行。请记住,在这种情况下,你无法获得stdin,stdout或stderr,因为你正在将进程从shell分离出来,因此请相应地重定向它们。


1
你可以尝试使用“screen”命令。
screen -d -m ping 8.8.8.8

这将启动一个屏幕并ping 8.8.8.8。您可以使用以下方式查看此屏幕

screen -ls

并使用

附加


screen -D <<screen_name>>

请注意,命令执行完成后屏幕将终止。

1

我尝试了transport类,它非常出色。这是我使用的代码:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = "host_ip", username = "un"], password = "up")
channel = ssh.get_transport().open_session()
pty = channel.get_pty()
shell = ssh.invoke_shell()
shell.send("cd /my/directory/; nohup ./exec_name > /dev/null 2>&1 &\n")

但我仍然不知道如何使用Python脚本来杀死它;我在这里有一个关于此的开放性问题here编辑1: 我已经成功解决了关于如何终止该进程的问题,您可以查看。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接