GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere il PID in base al nome del processo?

puoi anche usare pgrep , in prgep puoi anche dare uno schema per la corrispondenza

import subprocess
child = subprocess.Popen(['pgrep','program_name'], stdout=subprocess.PIPE, shell=True)
result = child.communicate()[0]

puoi anche usare awk con ps come questo

ps aux | awk '/name/{print $2}'

Puoi ottenere il pid dei processi per nome usando pidof tramite subprocess.check_output:

from subprocess import check_output
def get_pid(name):
    return check_output(["pidof",name])


In [5]: get_pid("java")
Out[5]: '23366\n'

check_output(["pidof",name]) eseguirà il comando come "pidof process_name" , Se il codice restituito era diverso da zero, genera un CalledProcessError.

Per gestire più voci e trasmettere a interi:

from subprocess import check_output
def get_pid(name):
    return map(int,check_output(["pidof",name]).split())

In [21]:get_pid("chrome")

Out[21]: 
[27698, 27678, 27665, 27649, 27540, 27530, 27517, 14884, 14719, 13849, 13708, 7713, 7310, 7291, 7217, 7208, 7204, 7189, 7180, 7175, 7166, 7151, 7138, 7127, 7117, 7114, 7107, 7095, 7091, 7087, 7083, 7073, 7065, 7056, 7048, 7028, 7011, 6997]

Oppure passa il -s flag per ottenere un singolo pid:

def get_pid(name):
    return int(check_output(["pidof","-s",name]))

In [25]: get_pid("chrome")
Out[25]: 27698

Per posix (Linux, BSD, ecc... serve solo la directory /proc per essere montata) è più facile lavorare con i file os in /proc. È puro Python, non c'è bisogno di chiamare programmi shell all'esterno.

Funziona su Python 2 e 3 ( L'unica differenza (2to3) è l'albero delle eccezioni, quindi "tranne l'eccezione ", che non mi piace ma ho mantenuto per mantenere la compatibilità. Avrei anche potuto creare un'eccezione personalizzata.)

#!/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]:
            print('{0:<12} : {1}'.format(dirname, ' '.join(content)))

Esempio di output (funziona come pgrep):

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

Puoi usare psutil pacchetto:

Installa

pip install psutil

Utilizzo:

import psutil

process_name = "chrome"
pid = None

for proc in psutil.process_iter():
    if process_name in proc.name():
       pid = proc.pid


Linux
  1. Come ottengo il percorso di un processo in Unix/Linux

  2. Come ottenere l'ID processo del processo in background?

  3. Come ottenere il pid di un processo e invocare kill -9 su di esso nello script della shell?

  4. Come ottenere il nome dell'utente da uid

  5. Come ottenere il pid del processo appena avviato

Come trovare un nome di processo utilizzando il numero PID in Linux

Come identificare un processo che non ha Pid?

Come trovare il nome del processo dal suo PID

Come ottenere solo l'ID del processo nello specificare il nome del processo in Linux?

Come ottenere il PID padre di un determinato processo in GNU/Linux dalla riga di comando?

Se conosco il numero PID di un processo, come posso ottenere il suo nome?