Brauche Hilfe bei Lösunge einer Aufgabe

T

todd#6

Jungspund
In der Dateil /etc/passwd sind zeilenweise alle User aufgelistet. Der Name ist dabei vom Zeilenanfang bis zum ersten Doppelpunkt.
Erstellen Sie ein Shellskript für folgende Ausgabe: Es listet alle in /etc/passwd genannten Benutzer auf,
für die zur Ausführungszeiten des Programms KEIN Prozess läuft.

Kann mir da vll jemand helfen??
Habe leider kA wie ich an die Sache herangehen muss.

ps befehl?

wäre super cool wenn mir einer helfen könnte
 
Als Gedankensütze:

1. For-Schleife in dem Bash-Script, welche die erste Zeile ausliest
2. Die gelesene Zeile mit sed / awk o.Ä. so kürzen, dass du nur den Username hast
3. "ps aux" gibt eine Liste aller Prozesse aus. Per "grep -c $USERNAME" kommst du an die Anzahl der Prozesse unter dem Benutzer
4. Per If schaust du, ob der Wert > 1 ist (1x ist immer das Grep selbst). Wenn ja gibst du Username aus / Wenn nein machst du nichts
5. Zurück zum Anfang der For

Hier könntest du jetzt das "ps aux" evtl. auch auslagern, so dass du es nicht mehrfach ausführen musst. Spart evtl. minimal performance.

Den Code solltest du aber versuchen selbst du schreiben. Sonst bringt dir die ganze Aufgabe nichts.
 
cool danke für deine hilfe werde das dann mal ausprobieren
 
Hi,

nur als Ergänzung/Anregung:

- "ps -u $USERNAME" liefert die Prozesse, "pgrep -u $USERNAME" nur die IDs aller Prozesse für einen User
- "cut" kann aus Zeilen einzelne Felder ausschneiden, die z.B. durch : getrennt sind - praktisch für die Felder in /etc/passwd
- xargs kann oft als Ersatz für eine for- oder while-Loop herhalten, wenn die Kommandos für die einzelnen Durchläufe nicht zu kompliziert werden

Damit lässt sich das Ganze schon als Einzeiler schreiben - wie nighT bereits erwähnt hat, kann es aber leicht ineffizient werden, wenn man pgrep oder ps für jeden User (also mehrmals) ausführt.

Daher der alternative Ansatz:

- "ps -e -o ruser=" liefert nur die Namen der aktiven Benutzer,
- "sort -u" entfernt die Duplikate,
- daraus kann man mit sed/paste/etc. einen "egrep -v"-Filter bauen,
- durch den man dann die Liste der Namen aus der /etc/passwd jagt (die man wieder mit cut erhält).

Das ergibt bei mir auch einen Einzeiler, der aber bei meinem Test um dem Faktor 25 schneller läuft (weil ps nur einmal ausgeführt werden muss).

Gruss, A.
 
finde es richtig cool, das ihr mir bei der aufgabe hilfestellungen gibt. werde eure ratschläge mal am wochenende versuchen anzuwenden.
 
ps -e -o ruser | sort -u > prozess
grep -E "^[a-z]*" pass | cut -d: -f1 > pass2
diff prozess pass2 | grep '^<' > ergeb

kann man das auch so machen.. ist sicherlich nciht schoen aber selten.
die pass= passwd
wie bekomme ich den pfad der passwd in mein script??
 
Hi,

sieht doch schon mal ganz interessant aus ... noch ein paar Tipps:

- mit "ps -e -o ruser=" eliminierst du auch gleich die Überschrift ("RUSER").
- "cut" kann auch direkt aus Dateien lesen, also sollte "cut -d: -f1 /etc/passwd" dir die Liste der existierenden User-Accounts liefern.
- diff ist eine Möglichkeit; aber schau dir doch mal die Manual-Page von "comm" an, damit kommst du in diesem Fall einfacher ans Ziel, denke ich.

;-)

A.
 
ist dann die aufgabe denn so gelößt??

das mit deinem cut befehl ist ncoh viel leichter.
deinen ersten punkt habe ich leider ncith verstanden!
kann man hier auch fragen zu SED posten.
 
Zuletzt bearbeitet:
ps -e -o ruser | sort -u > PID
cut -d: -f1 /etc/passwd > passwd
comm -3 passwd PID

so sollte das einwenig eleganter sein.. sicherlich noch nciht schoen aber selten :D
finde es cool das ihr mir hilfestellungen gibt.
 
Was ich mit dem ersten Punkt sagen wollte: wenn du "ps -e -o ruser" ausführst, bekommst du in der ersten Zeile die Überschrift (also "RUSER") geliefert. Das ist natürlich kein echter Benutzername - das kannst du aber unterdrücken, indem du statt "-o ruser" einfach "-o ruser=" verwendest. Der relevante Abschnitt aus der Manual-Page:

"Headers may be renamed (ps -o pid,ruser=RealUser -o comm=Command) as desired. If all column headers are empty (ps -o pid= -o comm=) then the header line will not be output."

A.
 

Ähnliche Themen

Prüfungsvorbereitung Posix Aufgaben, brauche Meinungen oder Hilfe,Danke

Prüfungsaufgabe X-Windows

mysql-server lässt sich nicht starten...

Server-Monitoring mit RRDTool

Zurück
Oben