• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Prozesse beenden

Escho

Advanced Hacker
Hallo

Projectx wird in OpenSuse über das Script /usr/bin/projectx.sh gestartet. Ein ps -ef bringt dann folgendes:
Code:
edgar     5997  5606  0 11:47 ?        00:00:00 /bin/sh /usr/bin/projectx.sh
edgar     6036  5997 19 11:47 ?        00:00:02 /usr/lib/jvm/java-1.6.0.u4-sun-1.6.0.u4/bin/java -classpath /usr/share/java/oro.jar:/usr/sh
Im der Prozesstabelle, als Baum dargestellt, sieht es so aus:
Code:
+ projectx.sh
|__ java.bin
Soweit also alles klar.

Nun möchte ich ein Script bauen, in dem projectx auch beendet werden kann. Gebe ich ein: killall projectx.sh, so wird dieser Prozess zwar beendet, der Prozess java.bin läuft aber weiter und muß seperat gekilled werden.

Gibt es keine Möglichkeit, daß mit der Beendigung des Hauptprozesses auch der Tochterprozess automatisch mit beendet wird?

Edgar
 

Asem

Newbie
ja, ein grund, warum java so besch.... :evil: aber ich will ja hier nicht bashen.

und ja, das geht: `killall -g projectx` killt die ganze prozessgruppe.

-- asem
 
OP
Escho

Escho

Advanced Hacker
Asem schrieb:
und ja, das geht: `killall -g projectx` killt die ganze prozessgruppe.

Das hätte ich auch gedacht, aber eine solche Eingabe bewirkt nur die Meldung: kein prozess wurde beendet.
Und sage ich
Code:
killall -g projectx.sh
, so beendet er anscheinend alles bis hinauf zu init. Am Bildschirm ist dann auf jeden Fall gar nichts mehr zu sehen außer etwas Hintergrundfarbe.

Edgar
 

Asem

Newbie
ja, das funktioniert nur, wenn der prozess von einer interaktiven shell aus gestartet wurde, nicht aus dem kde-startmenü oder sowas. sorry.

normalerweise kann man den java prozess doch an irgendwas festmachen, schau mal mit `ps auxww` wie der komplette aufruf heißt und dann bastel sowas wie `pkill -f 'java.*projectx'` oder wie immer das jar-file und/oder die main klasse heißen. das in den single quotes ist ein regulärer ausdruck und den solltest du so wählen, dass du nicht versehentlich noch andere prozesse damit abschießt.

-- asem

p.s.: zum testen des regex kannst du pgrep nehmen, die optionen und das verhalten sind identisch, nur dass kein signal zum prozess geschickt wird, sondern die PID angezeigt.
 
OP
Escho

Escho

Advanced Hacker
Das Java zu beenden ist an sich kein Problem. Es genügt ein killall java.bin. Nur wird mir damit auch eine zweite Session von Projectx beendet, die ich gleichzeitig gestartet habe.
Was du mir empfohlen hast, werde ich in den nächsten Tagen mal überdenken und ausprobieren.
Danke für die Hinweise

Edgar
 
Hallo

Hier ein Vorschlag der funktionieren müsste, anhand des Beispiels konqueror:

trommel@linux-jiac:~> konqueror &
[1] 5693
trommel@linux-jiac:~> kill `ps -f | grep konqueror | grep -v grep | awk '{print $2}'`
[1]+ Beendet konqueror
trommel@linux-jiac:~>


Kurz erklärt:
Konqueror hat die PID 5693.
ps -f gibt die aktuellen Prozesse aus.
grep Konqueror gibt alle Zeilen mit konqueror aus.
grep -v grep filtert die Zeile grep konqueror weg.
awk '{print $2}' gibt die Spalte mit der PID aus.
`` macht daraus eine Kommandosubstitution so das die Befehlskette letztlich zur gesuchten PID aufgelöst wird, die dann auch gleich von kill mit SIGTERM beendet wird.

Das ganze natürlich geschickt ins Script einflechten. Ich glaube das müsste klappen, weil man dann die Prozesse sozusagen mit dem Skalpell beenden kann.


Viel Glück beim ausprobieren. Das war von mir jetzt nur mal so ins Blaue.


Gruß Peter
 
Versuch mal dieses ( evtl. /usr/share/java/ProjectX.jar an die richtige Lage anpassen )

fuser /usr/share/java/ProjectX.jar 2>/dev/null | xargs kill -TERM

Haveaniceday
 
OP
Escho

Escho

Advanced Hacker
Man lernt viel zu auf so einer Wanderschaft (Zitat aus dem Film: Das Wirtshaus im Spessart) :D

Die von euch aufgezeigten Lösungsmöglichkeiten habe ich alle probiert und alle funktionieren! Da fällt die Auswahl schwer.

Herzlichen Dank an alle

Edgar
 
Die von euch aufgezeigten Lösungsmöglichkeiten habe ich alle probiert und alle funktionieren! Da fällt die Auswahl schwer.

Ich habe meinen Vorschlag ich glaube irgendwo in diesem Buch aufgeschnappt:
http://www.buch24.de/1203965207-105451364/shopdirekt.cgi?id=3688342&p=3&t=&h=&kid=0&klid=2&sid=1

Musste nur wieder zusammensuchen wie das nochmal genau ging.
Habe mich aber ehrlich gesagt nicht ganz an das Buch gehalten ;-)

Gruß Peter
 
OP
Escho

Escho

Advanced Hacker
Ich habe ein ähnliches Buch hier rumliegen, in dem ich dauernd blättere. Meins ist aber von Jürgen Wolf.

Ich habe übrigens den Vorschlag von Asem aufgegriffen und in meinen Wiki-Artikel über die DVB-Verarbeitung mit projectx übernommen.
Nicht böse sein, ihr anderen! :wink:

Edgar
 
Ich habe übrigens den Vorschlag von Asem aufgegriffen und in meinen Wiki-Artikel über die DVB-Verarbeitung mit projectx übernommen.

Ich lerne gerne dazu. Deshalb interessiert mich, wodurch sich genau dieser Vorschlag von den anderen abhebt.

Gruß Peter
 

Asem

Newbie
trommelpeter schrieb:
Ich lerne gerne dazu. Deshalb interessiert mich, wodurch sich genau dieser Vorschlag von den anderen abhebt.

@trommelpeter: deine variante ist natürlich die lehrbuchversion. sie killt genau den prozess, dessen namen du angibst (i. a. das aufgerufene executable). für diesen zweck gibt es aber mittlerweile in jeder gut sortierten linux distri den befehl pkill.

hier sollten aber die kindprozesse eines bestimmten prozesses gekillt werden. dazu müsstest du deine lösung noch etwas aufbohren, z. b. so:
Code:
kill `ps -ef|grep -E "^[^ ]+ +[^ ]+ \`ps -ef|grep projectx.sh|grep -v grep|awk '{print $2}'\`"|awk '{print $2}'`
da kommt mir meins doch etwas einfacher vor.

haveaniceday's lösung killt alle prozesse, die eine bestimmte datei augenblicklich im zugriff haben. unter bestimmten umständen könnte das auch ins auge gehen, zum beispiel wenn es, wie escho bemerkte, eine zweite session desselben programms gibt.

-- asem
 
OP
Escho

Escho

Advanced Hacker
Folgende Überlegungen haben mich zu der getroffenen Entscheidung geführt:

Vorschlag haveaniceday
Der Befehl verwendet einen absoluten Pfadnamen. Dieser Pfad muß bei eventuellen Systemänderungen dann im Script unter Umständen angepasst werden.

Vorschlag trommelpeter
Es wird eine Kommandosubstitution verwendet, die für den interessierten Laien ohne Shell-Kenntnis nur schwer nachzuvollziehen ist.

Vorschlag Asem
Der Befehl sieht irgendwie übersichtlich aus

Ich habe die Vorschläge einfach nacheinander in ein kleines Testscript kopiert, angepasst (etwa bei dir, Peter, aus dem Konqueror ein projectx gemacht) und ausprobiert. Nachdem alles funktioniert hat, habe ich dann erst mal angefangen zu lesen: Was ist pkill, wie funktioniert eine Kommandosubstitution, Welche Pfade gibt es zu Java, ... Dann habe ich versucht, mich dumm zu stellen und überlegt, was für mich am einfachsten zu begreifen wäre, wenn ich hilfesuchend einen Wiki-Artikel lese.

So bin ich letztendlich zu meiner Auswahl gekommen.

Edgar
 
OP
Escho

Escho

Advanced Hacker
@Asem

Deine Methode funktioniert bei zwei gleichen Instanzen übrigens auch nicht ganz so, wie sie eigentlich soll.
Starte ich projectx nur einmal, so ist alles klar. Das Programm wird durch das Script gelöscht.
Starte ich projectx jedoch zweimal, so wird nichts gelöscht. Der Löschbefehl im Script kann projectx nicht beeindrucken, weder das eine, noch das andere.

Ist aber kein Problem, da mich dieses Verhalten nicht stört. Naja, vielleicht werde ich in einer ruhigen Minute doch mal darüber nachdenken. :wink:

Damit ihr übrigens wisst, von welchem Script ich die ganze Zeit rede, setzt ich hier mal einen Link den entsprechenden Wiki-Beitrag von mir:
http://wiki.linux-club.de/opensuse/Projectx_oder_vom_DVB_zur_DVD_part_2

Edgar
 

Asem

Newbie
genau, wenn du beide instanzen über dasselbe script (projectx.sh) gestartet hast, dann findet pgrep auch zwei PIDs, die es jede auf einer zeile ausgibt. `pkill -P` erwartet aber mehrere PIDs als komma separierte liste. den delimiter kann man pgrep aber mitgeben. also wird dann folgendes draus:
Code:
pkill -P `pgrep -d, projectx.sh`

willst du einzelne instanzen killen können, müsstest du sie einfach über verschieden benamte scripte starten, z. b. indem du einen symlink anlegst:
Code:
ln -s projectx.sh projectx2.sh

-- asem
 
OP
Escho

Escho

Advanced Hacker
Ist gar nicht so einfach, einen Prozess totzukriegen oder? :D
Ich denke, ich werde es in meinem Script dennoch bei einem "einfachen" pgrep belassen.

Edgar
 
Hallo :D

Danke für den Lehrreichen Thread.
Besonders gefallen hat mir natürlich der Tipp mit dem Stromstecker ziehen ;-)
Geht das auch über die Kommandozeile? ;-)

Gruß Peter
 
Oben