Python 从帕拉米科那里得到PID

Python 从帕拉米科那里得到PID,python,paramiko,Python,Paramiko,我找不到一个简单的答案:我正在使用paramiko远程登录和执行许多进程,我需要每个进程的PID,以便以后检查它们。paramiko中似乎没有函数来获取已执行命令的PID,因此我尝试使用以下方法: stdin,stdout,stderr = ssh.exec_command('./someScript.sh &;echo $!;) 我以为通过标准输出进行解析会返回PID,但事实并非如此。我假设我应该在后台运行脚本,以获得一个PID(当它运行时)。有没有一种更简单、更明显的获取PID的方

我找不到一个简单的答案:我正在使用paramiko远程登录和执行许多进程,我需要每个进程的PID,以便以后检查它们。paramiko中似乎没有函数来获取已执行命令的PID,因此我尝试使用以下方法:

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

我以为通过标准输出进行解析会返回PID,但事实并非如此。我假设我应该在后台运行脚本,以获得一个PID(当它运行时)。有没有一种更简单、更明显的获取PID的方法?

当我稍后检查流程时,我通常使用标准的UNIX命令
pidof
。恐怕没有比这更简单的方法了

好的,根据您的注释,您可以通过将./someScript.sh包装到使用子流程模块的Python流程中来解决此问题

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')

并读取输出

以下是获取远程进程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

对,但这对我来说需要一个有点难看的黑客——我正在登录远程服务器,这些服务器可能有多个用户,当然也有多个运行我的软件的实例。我要寻找的是我设置的使用exec_命令运行的特定作业的PID。@JohnZwinck,一个不涉及调整远程命令的解决方案将涉及修补服务器上的SSH守护程序,而不是客户端上运行的
paramiko
模块。@SørenLøvborg的答案对我来说似乎是最合适的方式。为了更加安全,您可以使用
&&
而不是
在echo命令之后。这样你就不可能把错误的东西读作PID。@JohnZwinck:Ehn,我想
echo$$
是POSIX所必需的,并且基本上是所有shell实现中的内置实用程序。如果
echo$$
以某种方式失败,我会说所有赌注都输掉了。:-)@SørenLøvborg$$不是shell(不是运行的“命令”)的PID吗?@DavidDoria同样的东西。:-)使用
exec
意味着执行的命令继承shell PID。