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

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

что-то вроде

ps -ef | grep MyProgram

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

Ответ 1

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

Ответ 3

Если вы не ограничиваете себя стандартной библиотекой, мне нравится psutil.

Ответ 4

также: 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']

Ответ 5

Для Windows

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

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)

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

Ответ 6

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

Работает на python 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

Ответ 7

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

Ответ 8

Задача может быть решена с использованием следующей части кода, [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)