bash anwendungen starten + PID ermitteln
bash anwendungen starten + PID ermitteln
Hallo Community,
ich möchte per Shell einige Programme starten und bräuchte um die dann wieder zu beenden die PIDs mit denen die laufen. Wie kann ich die beim starten ermitteln in dem script?
Die PID von dem script krieg ich, glaube ich, mit $0.
Geht das überhaupt, wenn ja, wie?
Danke für Eure Hilfe.
MfG[/code]
ich möchte per Shell einige Programme starten und bräuchte um die dann wieder zu beenden die PIDs mit denen die laufen. Wie kann ich die beim starten ermitteln in dem script?
Die PID von dem script krieg ich, glaube ich, mit $0.
Geht das überhaupt, wenn ja, wie?
Danke für Eure Hilfe.
MfG[/code]
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
Code: Alles auswählen
markusgattol@pc1:~$ pidof workrave
2787
markusgattol@pc1:~$ kill `pidof workrave`
Markus
Hi,
in der Variable $0 steht der Name des Scriptes selber drinnen das gerade laeuft.
in der Variable $0 steht der Name des Scriptes selber drinnen das gerade laeuft.
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Code: Alles auswählen
gms1 ~ # sleep 100 &
[1] 20875
gms1 ~ # SLEEP_PID=$!
gms1 ~ # ps aux | grep $SLEEP_PID
root 20875 0.0 0.0 5972 744 pts/6 S 21:25 0:00 sleep 100
root 20879 0.0 0.0 4960 832 pts/6 R+ 21:25 0:00 grep --colour=auto 20875
gms
[edit]
die PID von der Shell ( ein Script hat keine PID ) bekommst du über $$moodsx hat geschrieben:Die PID von dem script krieg ich, glaube ich, mit $0.
[/edit]
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
Korrigiere mich wenn ich den Sachverhalt falsch darstelle.moodsx hat geschrieben:es ist zwar nicht genau das wonach ich gesucht habe, aber es hilft mir erstmal weiter. Danke
- Es geht nicht darum den durch das script gestarteten Prozess zu beenden da er nach der exekution automatisch terminiert sondern
- Du startest per script n Applikationen wobei n=0,1,2,...
- Du möchtest nicht das script beenden sondern die per script gestarteten Applikationen
- Dies, starten und beenden sollte interaktiv wie auch nicht interaktiv möglich sein
Wenn das zutrifft ist pidof dein Freund. Der Unterschied von interaktiv zu nicht interakiv is lediglich eine Indirektiion über das User Interface - der Unterbau
- eintragen der Applikationsnamen beim start in ein field
- entnehmen der Namen und weiterreichen an pidof um zu killen
bleibt für beide Fälle ident.
FAZIT
Ich denke schon, dass pidof in dem Fall am Besten ist. WIe erwähnt sollte ich (wir) dich falsch verstanden haben dann mache bitte eine gründlichere Problembeschreibung verfügbar damit wir eine zufriedenstellende Lösung erarbeiten können. Code hilft immer.
Markus
Shell-Scripts können, wenn keine geeigneten Gegenmaßnahmen ergriffen worden sind, auch zur selben Zeit laufen. Daher gibt es in diesen Fällen ein Concurrency-Problem, denn jedes Script sollte nur die Prozesse killen, die auch von diesem gestartet wurden.meandtheshell hat geschrieben: - Es geht nicht darum den durch das script gestarteten Prozess zu beenden da er nach der exekution automatisch terminiert sondern
- Du startest per script n Applikationen wobei n=0,1,2,...
- Du möchtest nicht das script beenden sondern die per script gestarteten Applikationen
- Dies, starten und beenden sollte interaktiv wie auch nicht interaktiv möglich sein
Wenn das zutrifft ist pidof dein Freund.
Aus diesem Grund verwende ich pidof/killall immer nur interaktiv.
Gruß
gms
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
Ok. Verstehe. Gut dann würde nach Standard vorgehen
- PID per App in file ablegen und
- see code
Wie man sieht, unüblich ist das verwenden von pidof auch non-interactive nicht. Es kommt eben darauf an was man beabsichtigt zu machen ... Warten wir auf input vom OP
Markus
- PID per App in file ablegen und
- see code
Code: Alles auswählen
markusgattol@pc1:~$ sed -n '/^pid/,/^}/p' /etc/init.d/apache2
pidof_apache() {
# if pidof is null for some reasons the script exits automagically
# classified as good/unknown feature
PIDS=`pidof apache2` || true
# let's try to find the pid file
# apache2 allows more than PidFile entry
# most simple way is to check all of them
PIDS2=""
for PFILE in `grep ^PidFile /etc/apache2/* -r | awk '{print $2}'`; do
[ -e $PFILE ] && PIDS2="$PIDS2 `cat $PFILE`"
done
# if there is a pid we need to verify that belongs to apache2
# for real
for i in $PIDS; do
# may be it is not the right way to make second dimension
# for really huge setups with hundreds of apache processes
# and tons of garbage in /etc/apache2... or is it?
for j in $PIDS2; do
if [ "$i" = "$j" ]; then
# in this case the pid stored in the
# pidfile matches one of the pidof apache
# so a simple kill will make it
echo $i
return 0
fi
done
done
return 1
}
markusgattol@pc1:~$
Markus
ok, das akzeptiere ich als Gegenbeispiel, obwohl, eigentlich wird hier pidof nicht verwendet wird um die gewünschte PID zu ermitteln ( die steht auch beim Apache in den PidFile), mit pidof wird hier nur noch zusätzlich überprüft, ob dieser Prozeß auch noch existiert.meandtheshell hat geschrieben: Wie man sieht, unüblich ist das verwenden von pidof auch non-interactive nicht.
volle Zustimmungmeandtheshell hat geschrieben:Es kommt eben darauf an was man beabsichtigt zu machen ...
Gruß
gms