bash anwendungen starten + PID ermitteln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
moodsx
Beiträge: 188
Registriert: 15.03.2007 09:17:25

bash anwendungen starten + PID ermitteln

Beitrag von moodsx » 06.07.2007 20:31:21

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]

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 06.07.2007 20:36:16

Code: Alles auswählen

markusgattol@pc1:~$ pidof workrave
2787
markusgattol@pc1:~$ kill `pidof workrave`
Du kannst natürlich alle möglichen expansionen in deinem script vornehmen und musst nicht den namen der app verwenden.

Markus

moodsx
Beiträge: 188
Registriert: 15.03.2007 09:17:25

Beitrag von moodsx » 06.07.2007 21:01:23

es ist zwar nicht genau das wonach ich gesucht habe, aber es hilft mir erstmal weiter. Danke

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 06.07.2007 21:19:39

hallo,

wäre "start-stop-daemon" nicht das was du suchst ... ?

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 06.07.2007 21:20:23

Hi,

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"

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 06.07.2007 21:26:57

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
Gruß
gms

[edit]
moodsx hat geschrieben:Die PID von dem script krieg ich, glaube ich, mit $0.
die PID von der Shell ( ein Script hat keine PID ) bekommst du über $$

[/edit]

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 06.07.2007 21:39:06

moodsx hat geschrieben:es ist zwar nicht genau das wonach ich gesucht habe, aber es hilft mir erstmal weiter. Danke
Korrigiere mich wenn ich den Sachverhalt falsch darstelle.

- 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

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 06.07.2007 21:57:22

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.
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.
Aus diesem Grund verwende ich pidof/killall immer nur interaktiv.

Gruß
gms

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 06.07.2007 22:26:02

Ok. Verstehe. Gut dann würde nach Standard vorgehen
- 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:~$ 
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

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 06.07.2007 23:31:01

meandtheshell hat geschrieben: Wie man sieht, unüblich ist das verwenden von pidof auch non-interactive nicht.
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:Es kommt eben darauf an was man beabsichtigt zu machen ...
volle Zustimmung :)

Gruß
gms

Antworten