7

我发现很难在后台使用 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,任何帮助表示赞赏。

4

5 回答 5

20

我尝试了这里和这里描述的所有方法都没有成功,最后意识到你需要使用通道而不是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 &')

所以nohup, dtach,screen等实际上是没有必要的。

于 2016-12-29T15:51:48.530 回答
4

你可以试试:

stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &') 
于 2015-09-30T08:47:46.467 回答
3

exec_command没有在交互式外壳中执行命令,因此“在后台运行进程”并没有真正意义。

如果你真的想这样做,你可以使用该命令nohup来启动你的进程,并在会话退出时让它保持活动状态。请记住,当您执行此操作时,您无法获取 stdin、stdout 或 stderr,因为您正在将进程与 shell 分离,因此请相应地重定向它们。

于 2014-02-03T21:27:52.040 回答
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 脚本杀死它;我在这里有一个悬而未决的问题。

编辑1:

我已经解决了关于以某种方式终止进程的问题;你可以检查一下。

于 2014-02-03T14:42:49.070 回答
1

您可以尝试使用屏幕

screen -d -m ping 8.8.8.8

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

screen -ls

并使用附加

screen -D <<screen_name>>

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

于 2017-12-04T23:38:18.913 回答