2016-04-26 13 views
4

Ich erstelle ein einfaches Programm in Python, das meine aktuellen Prozesse speichern sollte (mit Linux und pycharm).kann einige der Prozessnamen nicht sehen

meine Klassencode:

class pidSaver: 
    __pidDictionary={} 
    def __init__(self): 
     pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] 
     for pid in pids: 
      try: 
       os.kill(int(pid), 0) 
      except OSError as e: 
       if e.errno != errno.EPERM: #no premission error 
        continue 
      try: 
       self.__pidDictionary[pid]=open(os.path.join('/proc', pid, 'cmdline'), 'rb').read() 
      except IOError: # proc has already terminated 
       continue 

    def getDic(self): 
     return self.__pidDictionary 

und mein Haupt-Code:

pidsTry = pidSaver() 
printList= pidsTry.getDic() 
keyList= list(printList.keys()) 
IntegerKeyList=[] 
for key in keyList: 
    IntegerKeyList.append(int(key)) 
IntegerKeyList.sort() 
for key in IntegerKeyList: 
    print "%d : %s" %(key ,printList[str(key)]) 

die Ausgabe:

1 : /sbin/init 
2 : 
3 : 
5 : 
... 
7543 : less 
... 

so aus irgendeinem Grund für einige der Verfahren kann ich nicht einen Namen bekommen und ich habe einen leeren rausbekommen. , wenn ich auf meinem Computer laufe ps -aux | less der Befehl bekam ich dieses Ergebnis:

root   1 0.0 0.0 33776 4256 ?  Ss אפר24 0:01 /sbin/init 
root   2 0.0 0.0  0  0 ?  S אפר24 0:00 [kthreadd] 
root   3 0.0 0.0  0  0 ?  S אפר24 0:00 [ksoftirqd/0] 
myUser  7543 0.0 0.0 13752 1548 pts/9 T אפר24 0:00 less 

also im Grunde der Prozess, dass ich nicht in meinem Python sehen kann, sind die Verfahren, die von „[]“ umgeben.

Ich verstehe nicht, warum das ist. Außerdem möchte ich sie auch bekommen. Wie kann ich das machen und warum passiert das?

danke!

+0

Ziemlich sicher 'cat/proc/2/cmdline' zeigt Ihnen auch nichts, versuchen Sie 'strace ps -aux | grep/proc' –

+0

@PadraicCunningham hast du recht. aber das ist ein Prozess mit Pid 2. Vielleicht habe ich das falsch? Gibt es einen besseren Weg, mir die Infos zu zeigen? Und ich verstehe nicht wirklich warum? Warum gibt 'cat/proc/1/cmdline' mir Informationen, aber 2 nicht? – moshem

+0

Wenn Sie auf die Strace-Ausgabe schauen, können Sie '/ status' usw. sehen. Das ist, wo die Namen für das kommen, was Sie nicht sehen. –

Antwort

2

Diese Prozesse, die Sie nicht sehen können, sind Kernel-Threads. Wie der Name sagt, laufen sie im Kernel-Bereich und sind daher keine Kinder von PID 1, d. H. Das init-System. Ihre Cmdline ist leer, weil sie keine entsprechende ausführbare Datei haben, die aufgerufen wird und keine Argumente übergeben werden, und diese leere cmdline ist eine ziemlich sichere Methode, um sie zu identifizieren. Wenn Sie immer noch ihren Namen bekommen wollen, ist es in der Datei /proc/"pid"/status unter dem Namenfeld.

Verwandte Themen