2010-09-21 13 views
55

estoy escribiendo algunos scripts de monitorización en Python y estoy tratando de encontrar la manera más limpia para obtener el identificador de proceso de cualquier programa en ejecución aleatoria dado el nombre de ese programa¿Cómo se obtiene el ID de proceso de un programa en Unix o Linux usando Python?

algo así como

ps -ef | grep MyProgram 

podría analizar la salida de ese embargo pensé que podría ser una mejor manera en Python

+0

Si quieres trabajar cruz -plataforma (por ejemplo, igual de bien en Linux, Mac, Solaris, ...) no hay mejor manera de analizar la salida 'pf'. Si se trata de una única plataforma muy específica, edite su Q para agregar esa información obviamente crucial (las versiones exactas del sistema operativo a las que debe apuntar) * y * ¡también la etiqueta! –

+0

Puede analizar la salida del ps directamente en python – Mark

Respuesta

9

Trate pgrep. Su formato de salida es mucho más simple y, por lo tanto, más fácil de analizar.

222
+21

Eso obtiene el pid del proceso de python no lo que el usuario está pidiendo – Mark

+65

Es, sin embargo, una muy buena respuesta para el título de la pregunta –

+10

Sí, me consiguió lo que vino aquí por. – Jorvis

14

Si no se está limitando a la biblioteca estándar, me gusta psutil para esto.

Por ejemplo para encontrar todos los procesos "Python":

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

¿Puedes dar un ejemplo de lo mismo? –

+0

Por falta de ejemplo – Paullo

3

Para Windows

una manera de conseguir todos los PIDs de los programas en su ordenador sin necesidad de descargar módulos:

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) 

si sólo quería un programa o todos los programas con el mismo nombre y que quería para matar el proceso o algo:

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) 

eso fue sólo una pasta de mi programa de matar el proceso que podría hacerlo mucho mejor, pero está bien.

-1

La tarea se puede resolver utilizando el siguiente fragmento de código, [0:28] siendo el intervalo donde se mantiene el nombre, mientras que [29:34] contiene el pid real.

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

también: Python: How to get PID by process name?

Adaptación a anteriores publicadas respuestas.

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

Para POSIX (Linux, BSD, etc ... sólo necesita/proc directorio para ser montado) que es más fácil trabajar con archivos de sistema operativo en/proc

Obras en Python 2 y 3 (El único la diferencia es el árbol de excepciones, por lo tanto, el "excepto la excepción", que me disgusta pero mantiene para mantener la compatibilidad. También podría haber creado una excepción personalizada.)

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

Resultados de muestra (que funciona como pgrep):

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

Con psutil:

(se puede instalar con [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] 
Cuestiones relacionadas