# Prozessauflistung (Commandline-Guru gesucht)

## Vortex375

Hallo zusammen,

ich habe mir ein superkaramba-Theme geladen, das eine Prozess-Auflistung anzeigt. Es werden die 11 Prozesse mit der höchsten CPU-Auslastung angezeigt, sowie deren Benutzer. Dafür verwendet das Theme folgende Befehlszeile:

```
ps axo comm,user,pcpu --sort pcpu|tail -n11
```

Das Problem ist, dass bei der CPU-Auslastung offenbar die durchschnittliche Auslastung eines Prozesses seit er gestartet wurde angezeigt wird. Ich hätte gerne, dass die "momentane" Auslastung angezeigt wird, falls das möglich ist.

Im Augenblick ist die Liste nämlich nicht sehr aussagekräftig. Wenn zum Beispiel ein Programm, wie z.B. firefox, beim Start ordentlich CPU-Zeit beansprucht, dann bleibt er eine ganze Zeit lang in der Liste, obwohl er das System schon längst gar nicht mehr auslastet. Umgekehrt taucht ein Prozess, der schon längere Zeit im Hintergrund war und plötzlich das System auslastet, nicht in der Liste auf usw.

Weiß jemand, wie ich die Befehlszeile dafür anpassen müsste?

----------

## Kess

Du könntest nur die laufenden Prozesse betrachten: 

```
ps axo comm,user,pcpu,stat --sort pcpu | grep ' R' | tail -n11
```

Eigentlich müßte man den grep noch verfeinern, dass er wirklich nur den Prozessstatus abgreift, aber zu Demozwecken reicht das erst mal.

Alternativ könntest du Top im Batchmodus starten (mit -n 1 für einen einzelnen Durchlauf) und dir die ersten x Prozesse rausfischen

HTH

 Kess

----------

## Vortex375

 *Quote:*   

> Du könntest nur die laufenden Prozesse betrachten

 

Das hilft mir nur teilweise. Dann hätte ich immer noch das Problem, dass nicht die momentane Auslastung angezeigt wird.

Das geht mit ps offenbar auch gar nicht anders:

```

man ps:

                    cpu utilization of the process in "##.#" format.

                    Currently, it is the CPU time used divided by the time

                    the process has been running (cputime/realtime ratio),

                    expressed as a percentage. It will not add up to 100%

                    unless you are lucky. (alias pcpu).

```

 *Quote:*   

> Alternativ könntest du Top im Batchmodus starten (mit -n 1 für einen einzelnen Durchlauf) und dir die ersten x Prozesse rausfischen

 

Das muss ich noch Ausprobieren, aber wie krieg ich den ganzen Matsch oben dran weg? Und wie bearbeite ich den Output so, dass ich nur noch Prozessname, Benutzer und Auslastung habe?

Output von top sieht so aus:

```

top - 19:41:27 up  2:55,  1 user,  load average: 0.03, 0.10, 0.12

Tasks: 130 total,   1 running, 129 sleeping,   0 stopped,   0 zombie

Cpu(s):  8.4%us,  2.6%sy,  0.0%ni, 88.0%id,  0.7%wa,  0.0%hi,  0.2%si,  0.0%st

Mem:   2058104k total,  1798164k used,   259940k free,     7308k buffers

Swap:   987956k total,        0k used,   987956k free,  1383412k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

 5284 ich       20   0  148m  25m  17m S    4  1.3   1:01.10 kopete

 4635 root      10 -10  111m  54m 8196 S    2  2.7   2:56.16 X

 5268 ich       20   0 98944  18m  12m S    2  0.9   0:16.08 kicker

    1 root      20   0  2672  592  500 S    0  0.0   0:00.49 init

    2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

    3 root      RT  -5     0    0    0 S    0  0.0   0:00.22 migration/0

    4 root      15  -5     0    0    0 S    0  0.0   0:00.09 ksoftirqd/0

    5 root      RT  -5     0    0    0 S    0  0.0   0:00.23 migration/1

    6 root      15  -5     0    0    0 S    0  0.0   0:00.13 ksoftirqd/1

    7 root      15  -5     0    0    0 S    0  0.0   0:00.07 events/0

    8 root      15  -5     0    0    0 S    0  0.0   0:00.77 events/1

    9 root      15  -5     0    0    0 S    0  0.0   0:00.00 khelper

   61 root      15  -5     0    0    0 S    0  0.0   0:00.00 kblockd/0

   62 root      15  -5     0    0    0 S    0  0.0   0:00.00 kblockd/1

```

EDIT: Ah, Batchmodus. Augen auf!  :Shocked: 

----------

## sirro

```
/usr/bin/top -b -n 1|egrep '^ ?[0-9]+'|awk '{ print $9, $2, $12 }'|head -n 11
```

EDIT: Ausdruck verbessert (hat sonst PID>10000 übersehen)

----------

## Vortex375

Danke, sirro. Klappt prächtig!  :Very Happy: 

----------

## sirro

Sorry, habe es durch meinen Edit auch nicht besser gemacht, es wurde dann alles <1000 übersehen. Das sind zwar bei mir eh nur Kernel-Prozesse aber auch ein kcryptd frisst ja gerne mal was Leistung wenn man ihn laufen hat.

Jetzt aber:

```
top -b -n 1|egrep '^ *[0-9]+'|awk '{ print $9, $2, $12 }'|head -n 11
```

----------

## Knieper

 *sirro wrote:*   

> Sorry, habe es durch meinen Edit auch nicht besser gemacht, es wurde dann alles <1000 übersehen. Das sind zwar bei mir eh nur Kernel-Prozesse aber auch ein kcryptd frisst ja gerne mal was Leistung wenn man ihn laufen hat.
> 
> Jetzt aber:
> 
> ```
> ...

 

Kleiner Tipp an Dich: das "aufwendige" egrep kannst Du durch "tail -n +8" ersetzen. Ansonsten passt top mMn. nicht vernuenftig in die Reihe der Unixwerkzeuge. Ueber die Steuerung rege ich mich seit Jahren auf. Wird Zeit fuer eine kleine Alternative.

----------

## sirro

Öhm, ja natürlich.

Hätte ich auch drauf kommen können, dass die Anzahl der Zeilen oben ja immer gleich ist. :oops

Aber auf Performance kommt es ja hier nicht an *rausred*  :Wink: 

----------

## sirro

Um das wieder gut zu machen habe ich mit etwas schwarzer sed-Magie einen Prozess weniger in der Kette  :Wink: 

```
top -b -n 1|sed -re '1,+6d; 6,+10!d'|awk '{ print $9, $2, $12 }'
```

Nur mit sed wird es dann (bei mir) etwas länglich und unübersichtlich. Würde da awk bevorzugen. (Ausnutzung der festen Spaltenbreite)

```
top -b -n 1|sed -re '1,+6d; 6,+10!d; s#.{6}([^ ]+) *.{26} *([0-9]+).{16}(.*)$#\2 \1 \3#'
```

----------

## think4urs11

 *sirro wrote:*   

> 
> 
> ```
> top -b -n 1|sed -re '1,+6d; 6,+10!d; s#.{6}([^ ]+) *.{26} *([0-9]+).{16}(.*)$#\2 \1 \3#'
> ```
> ...

 

ein wenig schöner: ersetze '1,+6d; 6,+10!d' durch '8,18!d'

----------

