2009-11-13 17 views
6

Geçerli işlemin ana işlem kimliğini nasıl alabilirim?
Genel olarak bir süreç kimliği verildiğinde ana işlem kimliğini nasıl alabilirim?
örn. os.getpid() proccess kimliğini almak için kullanılabilir ve ebeveyni os.getppid(), nasıl alabilirim büyükbaba,Nasıl işlem görür büyükbaba kimliği

Hedefim linux (ubuntu) yani platforma özel cevaplar tamam.

+4

os.getpppid()? – paxdiablo

+1

evet ve daha iyi os.pnid olacaktır (pid, K) ya da sadece os.getppid (pid) –

cevap

7

linux özel:

os.popen("ps -p %d -oppid=" % os.getppid()).read().strip() 
+0

umursadığını sanmıyorum. – ddaa

+0

Linux için ihtiyacım var benim için bazı işler, güzel ve basit :) –

+0

+1 benimkinden daha basit bir çözüm. – paxdiablo

0

Genelde bunu taşınabilir bir şekilde yapabileceğinizi düşünmüyorum.

Bir sisteme özel bir şekilde elde edilir süreç listesinde (örneğin aracılığıyla ps komutu), bu bilgileri almak gerekir.

+0

cygwin yüklü sürece pencerelerde çalışmadığını, o Doğal olarak yaklaşık taşınabilirlik –

4

Ben taşınabilir bir Python moda yapabilirsiniz sanmıyorum. Ama iki olasılık var.

  1. Bu bilgi, ps komutundan edinilebilir, böylece bunu analiz edebilirsiniz.
  2. proc dosya sistemlerine sahip bir sisteminiz varsa, /proc/<pid>/status dosyasını açıp PPid: numaralı satırı arayabilir, ardından bu PID için aynı işlemi yapabilirsiniz.

Örneğin aşağıdaki script size istekli sizin PID PPID ve PPPID, izinler alacak: bu dosyaları açmak zorunda kalacaktı Açıkçası

3269 3160 3142 
UID  PID PPID C STIME TTY   TIME CMD 
pax  3142 2786 0 18:24 pts/1 00:00:00 bash 
root  3160 3142 0 18:24 pts/1 00:00:00 bash 
root  3269 3160 0 18:34 pts/1 00:00:00 /bin/bash ./getem.sh 

:

#!/bin/bash 
pid=$$ 
ppid=$(grep PPid: /proc/${pid}/status | awk '{print $2'}) 
pppid=$(grep PPid: /proc/${ppid}/status | awk '{print $2'}) 
echo ${pid} ${ppid} ${pppid} 
ps -f -p "${pid},${ppid},${pppid}" 

üretir Python ile.

+0

+1 iyi bir çalışma örneği, ancak pixelbeat'un cevabı kolayca çalışıyor, herhangi bir uyarı var mı? –

+0

Hayır, pixelbeat iyi görünüyor ve aslında, benim yöntemden biraz daha basit olduğu için onu ayırdım - ps için bu seçeneklerden haberdar değildim * çok * erken UNIX gününden geldim :-) – paxdiablo

+0

Cevabını düzenledim (ps satırı). Ps çıkışını filtrelemek için grep kullanmak yanlış sonuçlar verebilir (örneğin pppid'in 1 olduğunu düşünün). Bu arada, -p seçeneği oldukça eski. – tzot

0

böyle istediğiniz sütunları belirtmek sağlayan bir POSIX uyumlu 'ps' komutu, varsa: ps -o pid,ppid

Daha sonra deneyebilirsiniz: Şimdi

import os 
import re 

ps = os.popen("ps -o pid,ppid") 
ps.readline() # discard header 
lines = ps.readlines() 
ps.close 

procs = [ re.split("\s+", line.strip()) for line in lines ] 

parent = {} 
for proc in procs: 
    parent[ int(proc[0]) ] = int(proc[1]) 

yapabilirsiniz

parent[ parent[pid] ] 

hatta bir süreç ataları listelemek için bir fonksiyon yazabiliriz: do

psutil ( https://github.com/giampaolo/psutil) kullanılarak 210
def listp(pid): 
    print(pid) 
    if parent.has_key(pid): 
     listp(parent[pid]) 
+2

line.split(), re.split (r "\ s +", line.strip()) yerine çalışır. Varsayılan bölme(), \ s + üzerinde bölünür ve ön ve arkadaki boşlukları kaldırır. –

2
from __future__ import with_statement 

def pnid(pid=None, N=1): 
    "Get parent (if N==1), grandparent (if N==2), ... of pid (or self if not given)" 
    if pid is None: 
     pid= "self" 

    while N > 0: 
     filename= "/proc/%s/status" % pid 
     with open(filename, "r") as fp: 
      for line in fp: 
       if line.startswith("PPid:"): 
        _, _, pid= line.rpartition("\t") 
        pid= pid.rstrip() # drop the '\n' at end 
        break 
      else: 
       raise RuntimeError, "can't locate PPid line in %r" % filename 
     N-= 1 

    return int(pid) # let it fail through 


>>> pnid() 
26558 
>>> import os 
>>> os.getppid() 
26558 
>>> pnid(26558) 
26556 
>>> pnid(N=2) 
26556 
>>> pnid(N=3) 
1 
+0

btw, insanlar sık ​​sık neden bana PEP-8'i takip etmediğimi soruyorlar ve bir isim verdikten sonra bir isim kullanmıyorlar; C kodu için geliştirdiğim ve sakladığım eski bir alışkanlıktır; En son "=" hata (veya sözdizimi hatası) yerine "=" ile ısırıldığımdan beri yıllar geçti. Pnid için – tzot

+0

+1, ancak tekrarlayıcı olmaz "ps -p% d -oppid ="% pid çok daha kısa ve net olurdu –

+0

Bu, tek bir işlem python betiğidir; Bir kabuk betiği için daha uygun bir özgeçmişi buluyorum. Pitonu genel/bin/sh yerine kullanmıyorum. Yine de, yorumunuzdaki "+1" için teşekkürler. – tzot

20

:

>>> import psutil 
>>> psutil.Process().ppid() 
2335 
>>> psutil.Process().parent() 
<psutil.Process (pid=2335, name='bash', cmdline='bash') at 140052120886608> 
>>> 
+1

Bu daha güvenilir bir cevaptır, psutil bir cankurtaran. – blented

+0

, os.getpid() 'yerine os.getppid() olmalıdır. Psutil.Process (os.getpid()) yerine 'os.getppid()' işlevini kullanın. Ppid() '(* parent'in * pid değerini döndürmek için). * "İşlemin büyükbaba kimliğini almak için" * OP sorarken, psutil.Process (os.getppid()) .ppid() '(uyarı:' getppid() ',' getpid() 'değil) kullanın. – jfs

İlgili konular