2012-03-26 46 views
6

Tôi không thể tìm thấy câu trả lời đơn giản cho điều này: Tôi đang sử dụng paramiko để đăng nhập và thực hiện một số quy trình từ xa và tôi cần các PID của mỗi quy trình để kiểm tra chúng sau này . Có vẻ như không phải là một chức năng trong paramiko để có được PID của một lệnh thực hiện, vì vậy tôi cố gắng sử dụng như sau:lấy PID từ paramiko

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

Tôi nghĩ rằng sau đó phân tích cú pháp thông qua các thiết bị xuất chuẩn sẽ trả lại PID, nhưng nó doesn 't. Tôi giả sử tôi nên chạy kịch bản trong nền để có một PID (trong khi nó đang chạy). Có cách nào đơn giản hơn, rõ ràng hơn, để nhận được PID không?

+2

@JohnZwinck , một giải pháp không liên quan đến việc tinh chỉnh lệnh từ xa sẽ liên quan đến việc vá SSH daemon _on server_, không phải mô-đun 'paramiko' đang chạy trên máy khách. Câu trả lời của @ SørenLøvborg có vẻ là cách phù hợp nhất với tôi. – lanzz

Trả lời

9

Đây là một cách để có được quá trình ID từ xa:

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

Để an toàn hơn, bạn có thể sử dụng '&&' thay vì ';' sau lệnh echo. Bằng cách đó không có cơ hội bạn sẽ đọc sai điều như PID. –

+0

@JohnZwinck: Ehn, tôi đoán vậy. 'echo $$' được yêu cầu bởi POSIX và một tiện ích tích hợp trong tất cả các triển khai thực hiện shell [kể từ năm 1987 trở đi] (http://unix.stackexchange.com/questions/1355/why-is-echo-a-shell -built-in-command). Nếu 'echo $$ 'bằng cách nào đó thất bại, tôi muốn nói rằng tất cả mọi phiên cược đều bị tắt. :-) –

+0

@ SørenLøvborg Không phải là $$ PID của vỏ (không phải của 'lệnh' được chạy)? –

0

Tôi thường sử dụng lệnh UNIX chuẩn pidof <command name>, khi tôi kiểm tra quy trình sau. AFAIK không có cách nào đơn giản hơn.

OK, đưa ra nhận xét của bạn, bạn có thể giải quyết nó bằng cách gói ./someScript.sh của bạn trong một quy trình Python sử dụng mô-đun phụ.

wrapper.py:

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

Sau đó chạy

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

và đọc kết quả

+1

Phải, nhưng điều này sẽ cần một hack hơi xấu xí đối với tôi - Tôi đang đăng nhập vào các máy chủ từ xa có thể có nhiều người dùng và chắc chắn có nhiều phiên bản phần mềm của tôi chạy trên chúng. Những gì tôi đang tìm kiếm là PID của công việc cụ thể mà tôi thiết lập chạy với exec_command. – radpotato