2014-11-01 15 views

Trả lời

30

Bạn có thể lấy pid của tiến trình theo tên sử dụng pidof qua subprocess.check_output:

from subprocess import check_output 
def get_pid(name): 
    return check_output(["pidof",name]) 


In [5]: get_pid("java") 
Out[5]: '23366\n' 

check_output(["pidof",name]) sẽ chạy lệnh như "pidof process_name", Nếu mã trở lại là khác không nó sẽ gây nên CalledProcessError.

Để xử lý nhiều mục và dàn diễn viên để ints:

from subprocess import check_output 
def get_pid(name): 
    return map(int,check_output(["pidof",name]).split()) 

Trong [21]: get_pid ("chrome")

Out[21]: 
[27698, 27678, 27665, 27649, 27540, 27530, 27517, 14884, 14719, 13849, 13708, 7713, 7310, 7291, 7217, 7208, 7204, 7189, 7180, 7175, 7166, 7151, 7138, 7127, 7117, 7114, 7107, 7095, 7091, 7087, 7083, 7073, 7065, 7056, 7048, 7028, 7011, 6997] 

Hoặc pas các -s cờ để có được một pid duy nhất:

def get_pid(name): 
    return int(check_output(["pidof","-s",name])) 

In [25]: get_pid("chrome") 
Out[25]: 27698 
+0

+1 dường như một câu trả lời hoàn hảo.bạn có thể giải thích 'return check_output' này (["pidof", name]) ' –

+0

@AvinashRaj, thêm một lời giải thích, hy vọng làm cho nó rõ ràng hơn một chút –

+1

thích biết downvote là gì cho –

5

bạn cũng có thể sử dụng pgrep, trong prgep bạn cũng có thể cung cấp cho mô hình cho trận đấu

import subprocess 
child = subprocess.Popen(['pgrep','program_name'], stdout=subprocess.PIPE, shell=True) 
result = child.communicate()[0] 

bạn cũng có thể sử dụng awk với ps như thế này

ps aux | awk '/name/{print $2}' 
+0

Bạn có thể sử dụng một trong các hàm trợ giúp trong mô-đun tiến trình con .. dễ đọc hơn nhiều. Ngoài ra, thực hiện nó bên trong một vỏ là một ý tưởng thực sự xấu! – ThiefMaster

+0

yep của nó chỉ là một khái niệm, tôi đã cho OP – Hackaholic

+1

nó là tốt hơn để chạy với 'shell = False'. – sobolevn

4

Đối posix (Linux, BSD, vv ... chỉ cần/thư mục proc được gắn kết) dễ dàng hơn khi làm việc với các tệp os trong/proc. Trăn tinh khiết của nó, không cần phải gọi các chương trình shell bên ngoài.

Hoạt động trên python 2 và 3 (Sự khác biệt duy (2to3) là cây ngoại lệ, do đó "trừ ngoại lệ", mà tôi không thích nhưng vẫn giữ để duy trì khả năng tương thích. Ngoài ra có thể đã tạo ngoại lệ tùy chỉnh.)

#!/usr/bin/env python 

import os 
import sys 


for dirname in os.listdir('/proc'): 
    if dirname == 'curproc': 
     continue 

    try: 
     with open('/proc/{}/cmdline'.format(dirname), mode='rb') as fd: 
      content = fd.read().decode().split('\x00') 
    except Exception: 
     continue 

    for i in sys.argv[1:]: 
     if i in content[0]: 
      print('{0:<12} : {1}'.format(dirname, ' '.join(content))) 

Sample Output (nó hoạt động như pgrep):

phoemur ~/python $ ./pgrep.py bash 
1487   : -bash 
1779   : /bin/bash 
2

Để cải thiện câu trả lời của Padraic: khi check_output trả về một tổ chức phi zero mã, nó sẽ gây nên CalledProcessError. Điều này xảy ra khi quá trình không tồn tại hoặc không chạy.

Những gì tôi sẽ làm gì để bắt ngoại lệ này là:

#!/usr/bin/python 

from subprocess import check_output, CalledProcessError 

def getPIDs(process): 
    try: 
     pidlist = map(int, check_output(["pidof", process]).split()) 
    except CalledProcessError: 
     pidlist = [] 
    print 'list of PIDs = ' + ', '.join(str(e) for e in pidlist) 

if __name__ == '__main__': 
    getPIDs("chrome") 

Sản lượng:

$ python pidproc.py 
list of PIDS = 31840, 31841, 41942 
+0

Trong trường hợp này, vì chúng ta sẽ không làm bất cứ điều gì hữu ích trong try/catch, chúng ta cũng có thể sử dụng 'subprocess. gọi' thay vì 'subprocess.check_output' với khối try/catch. –

+0

@RajanPonnappan Với 'subprocess.call' bạn chỉ nhận được mã trả về ($?), Tuy nhiên' subprocess.check_output' trả về những gì bạn thực sự muốn: đầu ra lệnh (trong trường hợp này, danh sách PID) –

+1

Bạn nói đúng. Tôi đã nhầm lẫn giữa hành vi của 'check_call' và' check_output'. –

0

Hoàn dụ dựa trên tuyệt vời @answer Hackaholic của:

def get_process_id(name): 
    """Return process ids found by (partial) name or regex. 

    >>> get_process_id('kthreadd') 
    [2] 
    >>> get_process_id('watchdog') 
    [10, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61] # ymmv 
    >>> get_process_id('non-existent process') 
    [] 
    """ 
    child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, shell=False) 
    response = child.communicate()[0] 
    return [int(pid) for pid in response.split()] 
Các vấn đề liên quan