mirkandol
Goto Top

Skript, das bestimmte Prozesse für bestimmte User killt

Hallo,

ich habe hier folgendes Setup. Es gibt 2 VNC Server, die auf OpenSuSe 10.3 laufen und auf denen sich jeweils ca. 50 User tummeln.
Hin und wieder kommt es dabei zu Abstürzen einzelner Prozesse. Sehr beliebt ist bspw. ein Crash vom Firefox.

Ich habe bereits xkill eingebunden und damit kann der noch sichtbare FF Prozess auch vom User selber abgeschossen werden, aber meistens verbleibt noch ein versteckter toter Prozess, der davon nicht erfasst wird.

Ich brauche also ein Skript, das den Usernamen des gerade angemeldeten VNC Users herausfindet und alle Firefox-Prozesse, die zu diesem User gehören, abschießt. Ich will das Skript dann in icewm einbinden, damit die Leute nicht dauernd zum Prozess killen anrufen.

Kann mir da jemand weiterhelfen? Ich erwarte auch kein fertiges Skript (obwohl ich mich natürlich nicht dagegen wehren würde ;) ), aber da meine Skriptingfähigkeiten ungefähr so gut sind, wie die Doppelklickfähigkeit meiner Mama, ;) bräuchte ich zumindest ein paar Lösungsansätze.

Vielen Dank
Sven

Content-ID: 96675

Url: https://administrator.de/contentid/96675

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

theton
theton 11.09.2008 um 19:32:35 Uhr
Goto Top
kill -9 `ps awxu | grep firefox | grep numerische-UID-des-users | awk '{print $2}'`  

Die Backticks beachten.
Mirkandol
Mirkandol 12.09.2008 um 09:20:51 Uhr
Goto Top
Vielen Dank dir @theton. Damit kann ich schon viel anfangen.
Ich werde noch schauen, dass ich die UID des Users ebenfalls dynamisch auslese. Denn es ist ja ein VNC-Server und ich will das Skript nicht für jeden Nutzer einzeln einbinden, sondern allgemeingültig für alle jetztigen und künftigen User bereitstellen.

Ich schau mal wie weit ich komme.

Vielen Dank dir nochmal @theton
theton
theton 12.09.2008 um 09:41:57 Uhr
Goto Top
Ich bin kein Freund von Bash. Hier mal eine Beispiel-Lösung in Perl:

#!/usr/bin/perl -w

# UID mit Hilfe von 'whoami' und der /etc/passwd ermitteln 

# Username ermitteln
my $username = `whoami`;
# Zeilenumbruch entfernen
chomp($username);
# Zugehoerige Zeile aus der /etc/passwd holen
my $tmp = `grep $username /etc/passwd`;
# Zeile in ein Array splitten
my @temparr = split(/:/, $tmp);
# der 3. Wert im Array enthaelt die numerische UID
my $uid =  $temparr[2];

# Befehl zusammenbasteln
my $cmd = "kill -9 `ps awxu | grep firefox | grep $uid | awk '{print \$2}'`";  
# Befehl ausfuehren
my $out = `$cmd`;
# ggf. Output des Befehls ausgeben
print $out;

exit 0;
Mirkandol
Mirkandol 12.09.2008 um 09:56:42 Uhr
Goto Top
Nochmal danke sehr. Aber wenn ich das Script richtig verstehe, dann ist zumindest der Username fest verdrahtet und ich müsste für mind. 100 User eine eigene Version einbinden.

Mein Ziel ist es, dass alles vollautomatisch läuft, um den Verwaltungsaufwand so gering wie möglich zu halten.

Ich hab gerade den Befehlt "id" nachgeschlagen, der auch die uid, die gid und die groups anzeigt. Aus dieser Ausgabe müsste ich die nackte UID extrahieren. Bin noch am nachschlagen ;)


edit: OK. Ich habs gecheckt ;) Vielen Dank. Ich probiers gleich aus *hehe*
theton
theton 12.09.2008 um 10:12:56 Uhr
Goto Top
Der Username wird mittels 'whoami' eingelesen. 'whoami' gibt den Namen des aktuellen Benutzers aus. Das Skript sollte somit bei jedem User funktionieren. Lediglich der Programmname ist fest drin, aber auch das könnte man zur Not via Parameter abfragen.
Mirkandol
Mirkandol 12.09.2008 um 12:30:54 Uhr
Goto Top
Also das Script läuft super und erfüllt auch einwandfrei seinen Zweck, soweit ich das bisher sehen konnte.
Ich hab nur das Problem, dass es nur als root läuft, aber nicht als User. Wenn ich es als normaler User ausführe, dann passiert einfach nichts. Sobald ich ein sudo davorhänge und das PW eintippe gehts.

Auch Spielereien mit den Gruppenzugehörigkeiten haben nicht zum Erfolg geführt.
Ich rufe das Script mit der perl bin auf, wüsste auch nicht wie es sonst gehen könnte. Auch das Einpacken des Perl-Aufrufs in ein Shell-Script bringt keine Besserung.

Woran kann das liegen?


edit: Das Script ist ausführbar und ich hab als Owner auch einen Testuser eingetragen, aber es geht trotzdem nicht. Seine eigenen Prozesse kann dieser User aber manuell abschießen. An diesen Rechten kanns auch nicht liegen. Ich bin ratlos
theton
theton 12.09.2008 um 12:36:47 Uhr
Goto Top
Das könnte z.B. daran liegen, dass die /etc/passwd nicht für Benutzer lesbar ist. Die Rechte auf die /etc/passwd sollten so aussehen:

-rw-r--r-- 1 root root 2,0K 2008-08-27 08:03 /etc/passwd
Mirkandol
Mirkandol 12.09.2008 um 12:38:34 Uhr
Goto Top
Das hatte ich auch bereits getestet. Aber das Auslesen der passwd klappt wunderbar.
theton
theton 12.09.2008 um 12:59:49 Uhr
Goto Top
Ggf. mal $cmd mittels 'print' ausgeben und schauen ob der Befehl, der zusammengebaut wird, korrekt ist.
Mirkandol
Mirkandol 12.09.2008 um 13:16:26 Uhr
Goto Top
Ich werds gleich testen, aber wie gesagt. Wenn ich noch ein sudo davorhänge, dann macht er genau das, was erwartet wird.

Ich gehe also davon aus, dass das Script korrekt ist und das ganze ein Berechtigungsproblem ist. Mich irritiert allerdings, dass bei der sudo-Variante ein "Getötet" ausgegeben wird. o.O
Wo kommt der Begriff denn her? Denn wenn ich einfach so einen Kill per Konsole mache, dann läuft das geräuschlos ab.

Ich bin immer verwirrter.
theton
theton 12.09.2008 um 13:25:05 Uhr
Goto Top
Ob dieses "getötet" ausgegeben wird, hängt von den Einstellungen der Shell ab. Wird evtl. eine restricted Shell verwendet? Was passiert z.B., wenn du mal $cmd direkt auf der Shell des Users ausführst? Bei mir funktioniert das Skript jedenfalls auch mit normalen Benutzer-Accounts.
Mirkandol
Mirkandol 12.09.2008 um 13:43:13 Uhr
Goto Top
Also ich bin jetzt restlos am Ende mit meinem Latein. Ich habe ein "print $cmd" ins perlscript gepackt und dann die Ausgabe des Befehls kopiert und manuell in die Konsole gehackt:
kill -9 `ps awxu | grep firefox | grep 1076 | awk '{print $2}'`  
Als Ergebnis kam dann
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

Wenn ich noch ein sudo vor den kill-Befehl setze, dann kommt:
Passwort: 
kill: keine Prozess-ID angegeben
„kill --help“ gibt weitere Informationen.

Aber wenn ich das ganze Script mit sudo ausführe, dann gehts. :confused:
theton
theton 12.09.2008 um 13:48:09 Uhr
Goto Top
Scheinbar ist die Ausgabe von

ps awxu | grep firefox | grep 1076 | awk '{print $2}'  

beim Benutzer anders als bei root. Ggf. muss mittels awk ein anderes Feld ausgegeben werden. Wie sieht der Output von 'ps awxu | grep firefox | grep 1076' aus?
Mirkandol
Mirkandol 12.09.2008 um 14:07:18 Uhr
Goto Top
Danke. Das war der entscheidende Hinweis. Bei der Ausgabe gefiltert nach UID kam gar kein Ergebnis raus. Und dann ist mir aufgefallen, dass bei ps awxu nach den Usernamen sortiert wird.
Also habe ich im Perl-Script in der entscheidenden Zeile das $uid ersetzt durch $username und schon gings.
Mich wundert nur gerade bei genauerem Nachdenken, wieso das vorher mit sudo funktioniert hat. Denn eigentlich sollte der Kontext des Befehls ja dann root sein. Und damit auch die UID=0.
Wie kann es dann sein, dass beim Testuser die Firefoxfenster geschlossen wurden, wenn er ja eigentlich nur die mit der pasenden UID abschießen sollte?
theton
theton 12.09.2008 um 14:13:58 Uhr
Goto Top
root kann ja auch Prozesse anderer User killen und evtl. hat er deswegen dann einfach die UID ignoriert und einfach alles abgeschossen, wo firefox im Prozessnamen stand.
Mirkandol
Mirkandol 12.09.2008 um 14:16:45 Uhr
Goto Top
Na klar. So muss es sein. Er hat alle Firefoxprozesse abgeschossen, bei denen in der ps awxu eine 0 in der Ausgabe vorkam. Bspw. 1076 für den Testuser.
OMG! Ein Wunder, dass sich niemand beschwert hat ;)

Aber dennoch. Vielen Vielen Dank für deine tolle Hilfe @theton!

Ich setze mal auf erledigt.

Schönen Gruß
Sven