2012-03-26 22 views
6

我找不到一个简单的答案:我使用paramiko登录并远程执行一些进程,我需要每个进程的PID以便在稍后时间检查它们。似乎没有要在的paramiko得到一个执行的命令的PID功能,所以我尝试使用以下:从paramiko得到PID

stdin,stdout,stderr = ssh.exec_command('./someScript.sh &;echo $!;) 

我以为然后通过标准输出将返回PID解析,但它不“T。我假设我应该在后台运行脚本以获得PID(运行时)。有没有更简单明显的获取PID的方法?

+2

@JohnZwinck ,这个解决方案不涉及调整远程命令将涉及在服务器_上修补SSH守护进程,而不是在客户机上运行的'paramiko'模块。 @SørenLøvborg的答案似乎是对我来说最合适的方式。 – lanzz 2014-02-02 15:09:19

回答

9

这里的一个方式,以获得远程进程ID:

def execute(channel, command): 
    command = 'echo $$; exec ' + command 
    stdin, stdout, stderr = channel.exec_command(command) 
    pid = int(stdout.readline()) 
    return pid, stdin, stdout, stderr 
+1

为了保证安全,你可以在echo命令后面使用'&&'而不是';'。这样就没有机会作为PID读错了。 – 2014-02-03 02:47:53

+0

@JohnZwinck:恩,我想。 'echo $$'是POSIX所必需的,它是一个基本上所有shell实现中的内置工具[自1987年左右] [http://unix.stackexchange.com/questions/1355/why-is-echo-a-shell - 内置命令)。如果'echo $$'失败了,我会说所有的投注都关闭了。 :-) – 2014-02-04 15:43:01

+0

@SørenLøvborg不是$$ PID的shell(不是运行的'command')? – 2014-05-06 20:32:28

0

我通常使用标准的UNIX命令pidof <command name>,当我稍后检查该过程时。 AFAIK没有简单的方法。

好的,考虑到你的评论,你可以通过在使用子进程模块的Python进程中包装你的./someScript.sh来解决它。

wrapper.py:

import subprocess 
import sys 
proc = subprocess.Popen(sys.argv[1]) 
print proc.pid 
proc.wait() #probably 

然后运行

stdin,stdout,stderr = ssh.exec_command('./wrapper.py ./someScript.sh') 

和读取输出

+1

没错,但是这对我来说需要一些有点丑陋的破解 - 我正在登录到可能有多个用户的远程服务器,并且当然有多个我的软件在其上运行。我在寻找的是我使用exec_command运行的特定作业的PID。 – radpotato 2012-03-29 13:42:48