Как вы получаете идентификатор процесса программы в Unix или Linux с использованием Python?

Я пишу несколько сценариев мониторинга на Python и пытаюсь найти самый простой способ получения идентификатора процесса любой произвольно запущенной программы по названию этой программы.

что-то вроде

ps -ef | grep MyProgram

Я мог бы разобрать вывод этого, однако я думал, что может быть лучший способ в Python

 Mark21 сент. 2010 г., 17:10
Вы можете разобрать вывод ps прямо в python
 Alex Martelli21 сент. 2010 г., 17:08
Если вы хотите работать кроссплатформенно (например, на Linux, Mac, Solaris, ...), нет лучшего способа, чем разборpf выход. Если это для одной очень конкретной платформы, пожалуйста, отредактируйте свой Q, чтобы добавить эту, очевидно, важную информацию (точные версии ОС, на которые вы хотите ориентироваться)а также тег тоже!

Ответы на вопрос(9)

Python: Как получить PID по имени процесса?

Адаптация к предыдущим опубликованным ответам.

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:28] является интервалом, в котором хранится имя, а [29:34] содержит фактический 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)

BSD и т. Д. ... требуется только каталог / proc для монтирования) проще работать с файлами os в / proc

Работает на питоне 2 и 3 (Единственное отличие - дерево исключений, поэтомукроме исключения", что мне не нравится, но сохраняется для обеспечения совместимости. Также может создать пользовательское исключение.)

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

Пример вывода (работает как pgrep):

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

. Внешняя библиотека не требуется, и внешний процесс не запускается.

import glob

def get_command_pid(command):
    for path in glob.glob('/proc/*/comm'):
        if open(path).read().rstrip() == command:
            return path.split('/')[2]

Будет возвращен только первый найденный процесс сопоставления, который хорошо работает для некоторых целей. Чтобы получить PID нескольких совпадающих процессов, вы можете просто заменитьreturn сyield, а затем получить список сpids = list(get_command_pid(command)).

Альтернативно, как одно выражение:

Для одного процесса:

next(path.split('/')[2] for path in glob.glob('/proc/*/comm') if open(path).read().rstrip() == command)

Для нескольких процессов:

[path.split('/')[2] for path in glob.glob('/proc/*/comm') if open(path).read().rstrip() == command]

Способ получить все программы на вашем компьютере без загрузки каких-либо модулей:

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)

Если вы просто хотели одну программу или все программы с одинаковым именем и хотели бы убить процесс или что-то еще:

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)

Это была просто вставка моей программы уничтожения процессов, я мог бы сделать ее намного лучше, но это нормально.

Решение Вопроса

pgrep, Его выходной формат намного проще и, следовательно, легче анализировать.

psutil за это.

Например, чтобы найти все процессы "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}]
 krishna_oza03 мая 2017 г., 11:29
Можете ли вы привести пример для того же.
 Paullo20 янв. 2018 г., 10:37
Из-за отсутствия примера
 Yohn16 мар. 2017 г., 05:12
Хороший ответ. Простое лучше, чем сложное.
 Jorvis06 сент. 2016 г., 18:23
Да, это дало мне то, для чего я пришел сюда.
 Mark21 сент. 2010 г., 17:09
Это получает pid процесса python, а не того, о чем просит пользователь
 Wayne Conrad25 нояб. 2014 г., 22:06
Это, однако, очень хороший ответ для названия вопроса

psutil:

(может быть установлен с[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]

Ваш ответ на вопрос