2010-09-21 19 views
55

Tôi đang viết một số kịch bản giám sát bằng Python và tôi đang cố gắng để tìm ra cách sạch nhất để có được quá trình ID của bất kỳ chương trình chạy ngẫu nhiên được đặt tên của chương trình đóLàm thế nào để bạn nhận được ID quá trình của một chương trình trong Unix hoặc Linux bằng cách sử dụng Python?

cái gì đó như

ps -ef | grep MyProgram 

tôi có thể phân tích đầu ra của mà tuy nhiên tôi nghĩ rằng có thể có một cách tốt hơn trong python

+0

Nếu bạn muốn làm việc chéo - nền tảng (ví dụ như chỉ trên Linux, Mac, Solaris, ...) không có cách nào tốt hơn so với phân tích đầu ra 'pf'. Nếu nó dành cho một nền tảng rất cụ thể, vui lòng chỉnh sửa Q của bạn để thêm thông tin rõ ràng đó (các phiên bản hệ điều hành chính xác bạn cần nhắm mục tiêu) * và * thẻ đó! –

+0

Bạn có thể phân tích đầu ra của ps trực tiếp trong python – Mark

Trả lời

9

Hãy thử pgrep. Định dạng đầu ra của nó đơn giản hơn nhiều và do đó dễ dàng phân tích cú pháp hơn.

222
+21

Điều đó nhận được pid của quá trình python không phải những gì người dùng đang yêu cầu – Mark

+65

Đó là, tuy nhiên, một câu trả lời rất hay cho tiêu đề của câu hỏi –

+10

Có, nó đã cho tôi những gì tôi đến đây vì. – Jorvis

14

Nếu bạn không tự giới hạn mình vào thư viện chuẩn, tôi thích psutil cho việc này.

Ví dụ để tìm tất cả "trăn" quá trình:

>>> import psutil 
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']] 
[{'name': 'python3', 'pid': 21947}, 
{'name': 'python', 'pid': 23835}] 
+0

Bạn có thể vui lòng cung cấp một ví dụ cho giống nhau không. –

+0

Vì thiếu ví dụ – Paullo

3

Đối với Windows

Một Way để có được tất cả các PID của chương trình trên máy tính của bạn mà không cần tải bất kỳ module:

import os 

pids = [] 
a = os.popen("tasklist").readlines() 
for x in a: 
     try: 
     pids.append(int(x[29:34])) 
     except: 
      pass 
for each in pids: 
     print(each) 

Nếu bạn chỉ muốn một chương trình hoặc tất cả các chương trình có cùng tên và bạn muốn để giết quá trình hoặc một điều gì đó:

import os, sys, win32api 

tasklistrl = os.popen("tasklist").readlines() 
tasklistr = os.popen("tasklist").read() 

print(tasklistr) 

def kill(process): 
    process_exists_forsure = False 
    gotpid = False 
    for examine in tasklistrl: 
      if process == examine[0:len(process)]: 
       process_exists_forsure = True 
    if process_exists_forsure: 
     print("That process exists.") 
    else: 
     print("That process does not exist.") 
     raw_input() 
     sys.exit() 
    for getpid in tasklistrl: 
     if process == getpid[0:len(process)]: 
       pid = int(getpid[29:34]) 
       gotpid = True 
       try: 
        handle = win32api.OpenProcess(1, False, pid) 
        win32api.TerminateProcess(handle, 0) 
        win32api.CloseHandle(handle) 
        print("Successfully killed process %s on pid %d." % (getpid[0:len(prompt)], pid)) 
       except win32api.error as err: 
        print(err) 
        raw_input() 
        sys.exit() 
    if not gotpid: 
     print("Could not get process pid.") 
     raw_input() 
     sys.exit() 

    raw_input() 
    sys.exit() 

prompt = raw_input("Which process would you like to kill? ") 
kill(prompt) 

Đó chỉ là một quá trình xóa chương trình của tôi mà tôi có thể làm tốt hơn rất nhiều nhưng không sao.

-1

Nhiệm vụ có thể được giải quyết bằng đoạn mã sau, [0:28] là khoảng thời gian tên được giữ, trong khi [29:34] chứa pid thực.

import os 

program_pid = 0 
program_name = "notepad.exe" 

task_manager_lines = os.popen("tasklist").readlines() 
for line in task_manager_lines: 
    try: 
     if str(line[0:28]) == program_name + (28 - len(program_name) * ' ': #so it includes the whitespaces 
      program_pid = int(line[29:34]) 
      break 
    except: 
     pass 

print(program_pid) 
4

Ngoài ra: Python: How to get PID by process name?

Thích ứng với trước đó đăng tải câu trả lời.

def getpid(process_name): 
    import os 
    return [item.split()[1] for item in os.popen('tasklist').read().splitlines()[4:] if process_name in item.split()] 

getpid('cmd.exe') 
['6560', '3244', '9024', '4828'] 
0

Đối posix (Linux, BSD, vv ... chỉ cần/proc thư mục được gắn kết) nó dễ dàng hơn để làm việc với các tập tin os trong/proc

Hoạt động trên python 2 và 3 (Các chỉ khác biệt là cây Ngoại lệ, do đó, "ngoại trừ ngoại lệ", mà tôi không thích nhưng vẫn giữ để duy trì tính 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]: 
      # dirname is also the number of PID 
      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 
1

Với psutil:

(có thể được cài đặt với [sudo] pip install psutil)

import psutil 

# Get current process pid 
current_process_pid = psutil.Process().pid 
print(current_process_pid) # e.g 12971 

# Get pids by program name 
program_name = 'chrome' 
process_pids = [process.pid for process in psutil.process_iter() if process.name == program_name] 
print(process_pids) # e.g [1059, 2343, ..., ..., 9645] 
Các vấn đề liên quan