Sie sind nicht angemeldet.

1

11.04.2006, 17:03

Prozessliste generieren

Hi!

Habe noch eine Aufgabe zu bewältigen. :)

Hier mal die Angabe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.6. Prozessliste
Schreiben Sie ein einfaches Bash-Skript, welches den Befehl ps simuliert, aber nur
durch Zuhilfenahme des virtuellen /proc-Dateisystems, insbesondere das /proc/PID/status
File. Geben Sie die Prozess-ID, den Namen und den aktuellen State des Prozesses aus.
Beachten Sie auch, dass sich im /proc-Verzeichnis nicht nur Prozess-Unterverzeichnisse
Befinden, sondern auch weitere Schnittstellen zum Betriebssystem-Kern!
mike@mars:˜> ./myps.sh
1 Name: init State: S (sleeping)
10 Name: aio/0 State: S (sleeping)
1406 Name: khubd State: S (sleeping)
1426 Name: pccardd State: S (sleeping)
1443 Name: pccardd State: S (sleeping)
1504 Name: cardmgr State: S (sleeping)
161 Name: kseriod State: S (sleeping)
2 Name: ksoftirqd/0 State: S (sleeping)
2199 Name: hwscand State: S (sleeping)
2297 Name: khpsbpkt State: S (sleeping)
2399 Name: knodemgrd_0 State: S (sleeping)
...
...
...


Hat jemand Tips für mich, wie ich das realisieren kann?

Mit
grep "Pid" /proc/PID/status
grep "Name" /proc/PID/status
grep "State" /proc/PID/status
hab ich mal die geforderten Daten ausgelesen.

Das Problem ist, dass im /proc-Verzeichnis nicht nur Prozesse zu finden sind. Das muss also auch irgendwie gefiltert werden. Weiters hab ich das PRoblem, dass grep "PID" auch Zeilen wie PPid und TracerPid zurückgeben. Wie könnte ich das am geschicktesten filtern?

Wäre über ein paar Tips und Tricks dankbar! :applaus:

Liebe Grüsse.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

11.04.2006, 19:30

RE: Prozessliste generieren

nimm grep (oder egrep oö) und scanne nur nach zahlen im suchstring (siehe PATTERN, REGULAR EXPRESSIONS zb [:digit] oder [0-9]) in der man page, dann filtert grep etc nur verzeichnisnamen die aus zahlen bestehen.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

12.04.2006, 08:11

Hi,

und wie kann ich verhindern, dass er z.B. die PPid Zeile aus dem "status-File" mit ausgibt? Brauche ja nur die "Pid-Zeile"!

Liebe Grüsse.

Imhotep

followed the white rabbit

Beiträge: 1 530

Wohnort: Leipzig

Beruf: Informatiker

  • Nachricht senden

4

12.04.2006, 13:56

mit awk oder gawk, damit kannst du durch Leerzeichengetrennte Zeilen gezielt filtern
localhost,
sweet localhost

5

13.04.2006, 11:29

Hi!

Habe nun die Prozessverzeichnisse gefiltert.

Jedoch wie gebe ich nun am besten alle geforderten Statuszeilen aus?

Sollte ich es mit einer For-Schleife realisieren oder muss ich die Prozessliste zuerst in ein Array speichern, damit diese dann abgearbeitet werden kann und alle Daten ausgibt.

Weiteres Problem ist die Sortiertung. In der Ausgabe sollen ja Prozesse mit niedriger PID zuerst ausgegeben werden.

Denke ich zu kompliziert? Erbitte noch ein paar Denkanstösse! :)

Liebe Grüsse.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

13.04.2006, 11:44

forschleife und das ergebnis durch sort schicken, oder umgekehrt, erst prozessnummern sortierten mit sort und dann der for-schleife übergeben.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

7

13.04.2006, 23:41

Hi,

so, sieht schon ganz gut aus, jedoch hab ich ein Problem:

grep "Name" /proc/$i/status liefert am Ende immer einen Zeilenumbruch mit. Wie kann ich den wegfiltern?

Mit cut -d "\n" -f 2 oder so geht das nicht. Welches Zeichen muss ich fürn Delimiter setzen, damit er mir vorm Zeilenumbruch abschneidet?

Liebe Grüsse.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

8

14.04.2006, 00:37

Was hindert Dich eigentlich daran eine Suchmaschine zu verwenden?
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

9

14.04.2006, 01:25

Hi,

ja wäre eine Alternative. Aber wieso googlen, wenn hier Profis "sitzen"! *gg*

Liebe Grüsse.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

10

14.04.2006, 11:49

Auch 'ne Moeglichkeit von mir keine Antworten mehr zu bekommen.
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

12

14.04.2006, 16:59

Du stellst Fragen die sich durch 10 Minuten Google beantworten lassen und erwartest das sich jemand hinsetzt und Dir das zum x-ten Male erklaert und Deine Hausaufgaben macht. Dir ist klar das Du schlicht und einfach unverschaemt bist, ja?
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

13

16.04.2006, 15:48

Hi!

Ok, habt ja recht!

Aber bei meinem Zeilenumbruch-Problem komm ich auch mit Google nicht weiter!

Quellcode

1
echo -n "***" ; grep "Name" proc/PID/status ; echo -n "***"


Nach dem grep ist immer ein Zeilenumbruch dabei.

Mit grep alleine kann man den Zeilenumbruch nicht filtern, oder?

Liebe Grüsse.

14

16.04.2006, 22:18

Hi,

bin fündig geworden! *gg*

Habe mit tr einfach den Zeilenumbruch durch ein Leerzeichen ersetzt! *gg*

grep .... | awk ..... | tr '\n' ' '

Gibt es noch eine elegantere Lösung, sodass das Ergebnis komplett abgeschnitten wird, also dass auch kein Leerzeichen mehr dran hängt?

Liebe Grüsse.

15

16.04.2006, 22:35

Hi,

eine Kleinigkeit macht mir noch zu schaffen.

Wie kann ich mir sort diese Sortierreihenfolge erzielen?

1
10
1406
1426
1443
1504
161
2
2199
2297
2399


Vielleicht weiss das noch jemadn auf die Schnelle?

Liebe Grüsse.

16

16.04.2006, 22:55

Hi,

wieder zu komliziert gedacht. "sort" ohne Parameter macht das eh so wie gefordert. :ätsch:

so geschafft! :applaus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
clear
echo "Aufgabe 1.6"
for i in `ls /proc/ | grep [0..9] | sort`
do
  echo -n $i" "
  grep "Name" /proc/$i/status | awk '{print $1" "$2}' | tr '\n' ' '
  echo -n ""
  grep "State" /proc/$i/status | awk '{print $1" "$2" "$3}' | tr '\n' ' '
  echo ""				#damit auch bei toten Prozessen ein Zeilenumbruch geschrieben wird
done


Der Nachteil ist, dass zwischen dem Scannen der aktuellen Prozesseverzeichnisse und dem Ausgeben welche beendet werden können. Dann versucht die For-Schleife auf ein Statusfile bzw. Verzeichnis zuzugreifen, welches nicht mehr exisitert.

Liebe Grüsse.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »onlineuser« (16.04.2006, 22:58)


Thema bewerten