2012-03-26 130 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