Liste aller Prozesse (Nur Namen)
Liste aller Prozesse (Nur Namen)
hi,
ich suche eine schöne Möglichkeit, eine Liste aller Namen von laufenden Prozessen zu bekommen. Praktisch die letzte Spalte von ps aux. Die Lösung soll entweder per bash oder Python realisiert werden, da die Funktion später in einem Python-Programm verwendet werden soll.
Der erste Gedanke war die Ausgabe von ps aux mit cut zu bearbeiten, aber es sind ja zwischen den einzelnen Spalten unterschiedlich viele Leerzeichen etc.
Ein anderer Ansatz wäre von hinten loszugehen und alle Strings bis zu dem Auftreten der Time Spalte auszulesen, wobei man die Time-Spalte dann per regexp erkennen lassen könnte. Das ist mir aber eigentlich zu "unschön", da es Probleme geben kann wenn im Prozessnamen auch ein Teil auftaucht, der dem Time-Format ähnelt.
Hat jemand einen besseren Vorschlag ? Ich habe auch schon an /proc gedacht (Datei /proc/$pid/status auslesen), aber dort finde ich auch Einträge von Modulen . .. (z.b. taucht bei mir ipw2200 auf)(diese tauchen ja auch in ps aux auf, sind dort aber durch eckige klammern gekennzeichnet..)
Vielen Dank schonmal für eure Vorschläge,
mfg
mauser
ich suche eine schöne Möglichkeit, eine Liste aller Namen von laufenden Prozessen zu bekommen. Praktisch die letzte Spalte von ps aux. Die Lösung soll entweder per bash oder Python realisiert werden, da die Funktion später in einem Python-Programm verwendet werden soll.
Der erste Gedanke war die Ausgabe von ps aux mit cut zu bearbeiten, aber es sind ja zwischen den einzelnen Spalten unterschiedlich viele Leerzeichen etc.
Ein anderer Ansatz wäre von hinten loszugehen und alle Strings bis zu dem Auftreten der Time Spalte auszulesen, wobei man die Time-Spalte dann per regexp erkennen lassen könnte. Das ist mir aber eigentlich zu "unschön", da es Probleme geben kann wenn im Prozessnamen auch ein Teil auftaucht, der dem Time-Format ähnelt.
Hat jemand einen besseren Vorschlag ? Ich habe auch schon an /proc gedacht (Datei /proc/$pid/status auslesen), aber dort finde ich auch Einträge von Modulen . .. (z.b. taucht bei mir ipw2200 auf)(diese tauchen ja auch in ps aux auf, sind dort aber durch eckige klammern gekennzeichnet..)
Vielen Dank schonmal für eure Vorschläge,
mfg
mauser
- C_A
- Beiträge: 1082
- Registriert: 22.04.2004 14:51:01
- Lizenz eigener Beiträge: GNU General Public License
vielleicht:
Code: Alles auswählen
#!/usr/bin/env python
import os
ps=os.popen('ps aux', 'r')
l=[]
for i in ps:
if i.split()[10] == 'COMMAND':
continue
l.append(i.split()[10])
l.sort()
for i in l:
print i
Wenn du ps faux mit awk bearbeitest, müsste es gehen, denn awk ist es egal wie viele Leerzeichen dazwischen sind.
Es müsste dann in etwa so aussehen:
wobei es dann noch einige leerzeichen im Namen hinten geben kann, da muss man evtl noch n bissl handarbeit anlegen
Es müsste dann in etwa so aussehen:
Code: Alles auswählen
ps faux | awk -F" " '{print $11}'
hi,
danke an euch beide für eure schnellen Antworten !
Anscheinend ist Python's split auch besser gegen die Leerzeichen gewappnet wie cut. Eigentlich hätte ich da auch selber drauf kommen können..
Ich habe jetzt den Vorschlag con C_A übernommen und ihn so abgewandelt, das er keine Module mehr anzeigt und den vollständigen Namen des Prozesses, auch wenn er Leerzeichen enthält:
mfg
mauser
danke an euch beide für eure schnellen Antworten !
Anscheinend ist Python's split auch besser gegen die Leerzeichen gewappnet wie cut. Eigentlich hätte ich da auch selber drauf kommen können..
Ich habe jetzt den Vorschlag con C_A übernommen und ihn so abgewandelt, das er keine Module mehr anzeigt und den vollständigen Namen des Prozesses, auch wenn er Leerzeichen enthält:
Code: Alles auswählen
1 #!/usr/bin/env python
2 import os
3 import re
4
5
6 p=re.compile('\[.+\]')
7
8 ps=os.popen('ps aux', 'r')
9 l=[]
10 for i in ps:
11 if i.split()[10] == 'COMMAND':
12 continue
13 append_string=i.split()[10]
14 try:
15 for ii in range (11,len(i.split())):
16 append_string+=" "+i.split()[ii]
17 except Exception:
18 pass
19
20 if not p.match(append_string):
21 l.append(append_string)
22
23 l.sort()
24 for i in l:
25 print i
mauser
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
Code: Alles auswählen
ps -ax | cut -d : -f2 | cut -d " " -f2
Warum so kompliziert? Das ist doch einfacher.
Code: Alles auswählen
ps -aAo "%c" --no-heading
Einfacher schon, aber nicht dieselbe Ausgabe Denn bei dir fehlen die Argumente der Prozesse sowie die Klammern um die Module.. Ohne die sind die Module nicht mehr als solche zu erkennen ..ToPeG hat geschrieben:Warum so kompliziert?Das ist doch einfacher.Code: Alles auswählen
ps -aAo "%c" --no-heading
mfg
mauser
"man ps" hätte weitergeholfen
Code: Alles auswählen
ps -aAo "%a" --no-heading