althoffc schrieb:
ich möchte über ein Shell-Skript die Prozessnummer eines bestimmten laufenden Programmes ermitteln.
Da bietet sich pgrep
an.
Dazu verwende ich ein Suchpattern, welches eindeutig für den gesuchten Prozess ist.
Ich verwende hierzu bisher folgende Skript-Zeile mit den Suchmustern abc (grep) und /def/ (awk).
| prozess=`ps -ef | grep abc | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`
|
Das kann man mindestens vereinfachen zu
| prozess=`ps -ef | awk '/abc/ && /def/ {print "Prozess: " $1 " " $2 " " $9} '`
|
Mir ist es aber noch nicht gelungen, die Suchmuster abc bzw. /def/ über Parameter oder Variablen dynamisch
zu verwenden. Entweder scheiterte es an der Syntax, die Variablenwerte wurde nicht erkannt und die Suchergebnisse waren nicht die erwarteten.
Ich habe folgende versucht:
| filter=abc
prozess=`ps -ef | grep $filter | awk '/def/ {print "Prozess: " $1 " " $2 " " $9} '`
|
Jedoch führte das nicht zu den gewünschten Ergebnissen.
Dann wäre prima, wenn Du die Ergebnisse und Deine Erwartungen zeigst. Diese Variante liefert nämlich genau das gleiche wie Deine erste Variante. Du hast ja nur $filter eingeführt und die Zeichenkette "abc" enthält keine Shell-Meta-Zeichen, die man escapen müsste.
Weitere Anmerkungen:
Ich würde die auszugebenden Spalten von ps
explizit wählen, damit ich sicher bin, was ich bekomme. Dann kann man auch gezielt awk
gegen einzelne Felder matchen lassen.
Man kann auch die Kopfzeile von ps
ausblenden, falls es da zu falschen Treffern kommt.
$9 wird nur manchmal gefüllt sein, nämlich wenn ein Prozess entsprechend viele Parameter hat. Ist es das, was Du willst?
Möglicherweise bietet sich ein zweistufiger Ansatz an: man nutzt eine Ausgabe von ps
mit speziellen Spalten, match in awk
und lässt es die PIDs der gefundenen Prozesse ausgeben, was wiederum über xargs -r ps -o cpu,pid,...
genutzt wird, um Infos über die Prozesse auszugeben.
Gibt es Ideen, wie ich ein Suchmuster/Filter in obiger Zeile z.B. für grep verwenden kann?
Die Lösung mit awk
findest Du hier.
Was ist denn die Aufgabe Deines Skriptes, also, gegen welche Felder willst Du matchen und was willst Du ausgeben?