2010-09-21 13 views
55

Piszę kilka skryptów monitorowania w Pythonie i próbuję odnaleźć najczystszy sposób, aby uzyskać identyfikator procesu dowolnej losowej uruchomionego programu danej nazwa tego programuJak uzyskać identyfikator procesu programu w systemie Unix lub Linux przy użyciu Pythona?

coś

ps -ef | grep MyProgram 

mógłbym analizować dane wyjściowe, które jednak myślałem, że może być lepszy sposób w python

+0

Jeśli chcesz pracować krzyż -platform (np. równie dobrze w systemach Linux, Mac, Solaris, ...) nie ma lepszego sposobu niż parsowanie wyjścia 'pf'. Jeśli jest to przeznaczone dla pojedynczej, bardzo specyficznej platformy, edytuj swoje Q, aby dodać tę oczywiście kluczową informację (dokładne wersje systemu operacyjnego, na które musisz trafić) * i * także tag! –

+0

Możesz odczytywać dane wyjściowe pliku ps bezpośrednio w pythonie – Mark

Odpowiedz

9

Spróbuj pgrep. Jego format wyjściowy jest znacznie prostszy i łatwiejszy do analizy.

222
+21

Otrzymuje to pid procesu pythonowego, a nie pytanie użytkownika o – Mark

+65

Jest to jednak bardzo dobra odpowiedź dla tytułu pytania –

+10

Tak, dostałem to, co ja przybyłem tutaj. – Jorvis

14

Jeśli nie ograniczasz się do standardowej biblioteki, to lubię psutil.

Na przykład, aby znaleźć wszystkie "python" Procesy:

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

Czy możesz podać przykład tego samego. –

+0

Z braku przykładu – Paullo

3

Dla Windows

sposób, aby uzyskać wszystkie PID programów na komputerze bez pobierania żadnych modułów:

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) 

Jeśli tylko chciał jeden program lub wszystkie programy o tej samej nazwie i chciałeś zabić proces lub coś:

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) 

to była tylko pastę mojego programu kill proces mogłem zrobić to o wiele lepiej, ale to jest w porządku.

-1

Zadanie można rozwiązać za pomocą poniższego kodu, [0:28] będącego interwałem, w którym nazwa jest przetrzymywana, a [29:34] zawiera aktualny pid.

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

również: Python: How to get PID by process name?

Adaptacja do poprzedniej wysłana odpowiedź.

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

POSIX (Linux, BSD itp ... wystarczy katalogu/proc do zamontowania) łatwiej jest pracować z plikami os w/proc

działa na Python 2 i 3 (tylko Różnica jest drzewem wyjątków, dlatego "z wyjątkiem wyjątku", które nie lubię, ale utrzymywane w celu utrzymania zgodności. Również mógł utworzyć niestandardowy wyjątek.)

#!/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))) 

Próbka wyjściowa (działa jak pgrep):

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

Z psutil:

(może być zainstalowany z [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] 
Powiązane problemy