在后台运行进程

时间:2013-07-10 00:24:55

标签: paramiko

我发现使用paramiko很难在后台运行一个进程。我用过:

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

发现没有发现executefile.py进程正在运行。

然后我尝试使用其他方式包括反斜杠:

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

此方法有效。有一个实例在机器上运行,但毫不奇怪,它没有在后台运行。我可以知道因为它没有在后台运行,因为代码在此代码之后停留在第二行。这是

all_inf = stdout.readlines()

现在代码没有超出上面的行,除非脚本的进程被杀死。

我正在学习paramiko,感谢任何帮助。

5 个答案:

答案 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>>

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