我发现使用paramiko很难在后台运行一个进程。我用过:
stdin, stdout, stderr = ssh.exec_command('executefile.py &')
发现没有发现executefile.py进程正在运行。
然后我尝试使用其他方式包括反斜杠:
stdin, stdout, stderr = ssh.exec_command('executefile.py \&')
此方法有效。有一个实例在机器上运行,但毫不奇怪,它没有在后台运行。我可以知道因为它没有在后台运行,因为代码在此代码之后停留在第二行。这是
all_inf = stdout.readlines()
现在代码没有超出上面的行,除非脚本的进程被杀死。
我正在学习paramiko,感谢任何帮助。
答案 0 :(得分:11)
我已经尝试了这里描述的所有方法和here但没有成功,最后意识到你需要使用通道而不是直接使用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等实际上并不是必需的。
答案 1 :(得分:3)
exec_command
没有在交互式shell中执行命令,因此“在后台运行进程”并没有多大意义。
如果确实想要这样做,您可以使用命令nohup
启动您的进程,并在会话退出时保持活动状态。请记住,执行此操作时无法获取stdin,stdout或stderr,因为您要从shell中分离进程,因此请相应地重定向它们。
答案 2 :(得分:3)
您可以尝试:
stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &')
答案 3 :(得分: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:
我已经解决了以某种方式杀死进程的问题;你可以查一下。
答案 4 :(得分:0)
您可以尝试使用屏幕
screen -d -m ping 8.8.8.8
这将启动一个屏幕并ping 8.8.8.8。您可以使用
查看此屏幕screen -ls
并使用
附加screen -D <<screen_name>>
请注意,命令执行完毕后屏幕将终止。