PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : variable=`ProgrammPID`



pir
24-11-2004, 09:55
Hallo,

Ich habe mir ein Bash - Script geschrieben, aus dem ich versch. Programme Aufrufe. Darunter befindet auch ein eigens Programm, welches ständig im Hintergrund loopt. Im Script gibt es aber Abfragen, welche, wenn zutreffend, diesen Loop beenden müssen. Meine Frage ist also, kann ich beim Starten eines Programms irgendwie seine PID zurück bekommen und abspeichern, um dann einfach einen "kill PID" abzusetzen?

Danke Pir

pir
24-11-2004, 14:53
Also wenn es wen iteressiert.
Ich habe leider keine Möglichkeit gefunden, wie man beim Starten die PID bekommt. Dafür verwende ich aber:
pkill -f programm_mit_parametern

Es ist aber nicht das was ich wollte. Vorschläge sind immer noch willkommen.

Gruß Pir

mehlvogel
24-11-2004, 15:36
Unter Linux? in dem Programm welches loopt per getpid die pid holen und in eine Datei schreiben, die dann auslesen udn töten bei Bedarf.

man getpid

HangLoose
24-11-2004, 18:29
moin moin


pgrep oder pidof schon probiert oder meinst du was anderes?


Gruß HL

pir
25-11-2004, 07:43
@mehlvogel: Diese Version hatte ich auch im Hinterkopf nur muss ich ehrlich sagen, dass mir das etwas mühsam vorkam, so einen Umweg zu gehen. Ich dachte mir, dass es da etwas einfacheres auch geben muss.

@hangloose: Ja, habe schon beide ausprobiert, nur ist mir folgendes nicht gelungen (pgrep ist wie pkill):
in der Kommandozeile:
./LED 0 1 &
pkill -f LED (funktioniert,killt alle LED-Prozesse)
pkill -f "LED 0 1" (funktioniert, killt nur den LED-Prozess der so aufgerufen wurde)

jedoch ...
sobald ich versuche das gleiche aus einem Script aufzurufen
(${PROG_DIR}${PROG_LED} $var1 $var2 #funkt, das LED Prog. startet)
pkill -f ${PROG_LED} (funktioniert,killt alle LED-Prozesse)

........................................räusper .............................................
...... habe gerade meinen Scriptfehler gefunden ... ich lasse aber die geschriebene Info für andere, damit sie daraus lernen können.

pkill -f "${PROG_DIR}${PROG_LED} $var1 $var2" #funktioniert
:rolleyes:
mein Fehler war, dass ich das ${PROG_DIR} vergessen habe und -f prüft auf die gesamte Zeile ... das Leben ist nicht einfach :)
und aufgrund dessen, dass ich in der Kommandozeile immer ./LED 0 1 geschrieben habe, habe ich das irgendwie übersehen, dass ich es im Script anders aufrufe.

... das Interessante ist nun aber, dass
pkill -f ${PROG_LED} funktioniert und alle LED Programme gekillt werden, obwohl ich nur einen Teil der aufrufenden Zeile eingebe. Das bedarf noch einer Untersuchung. Falls ich etwas entdecke melde ich mich ;)

Gruß Pir

anda_skoa
25-11-2004, 11:45
Meine Frage ist also, kann ich beim Starten eines Programms irgendwie seine PID zurück bekommen und abspeichern, um dann einfach einen "kill PID" abzusetzen?


In der Bash wird beim Starten im Hintergrund die PID des gestarten Prozesses in eine Bash Variable geschrieben, $? oder $$ oder was ähnliches.

Ciao,
_

fs111
25-11-2004, 11:57
In der Bash wird beim Starten im Hintergrund die PID des gestarten Prozesses in eine Bash Variable geschrieben, $? oder $$ oder was ähnliches.

Ciao,
_


$? ist exit-code des letzten Programmes, nicht die PID

fs111

pir
25-11-2004, 15:52
Also, damit Klarheit herrscht ;)
Die Variable heißt $! und gibt zurück die PID des letzten im background aufgerufenen Befehls. Nur wollte ich diese nicht verwenden, denn es könnte ja vorkommen, dass ich das zu killende Prog. aufrufe, dann ruft ein anderes Script inzwischen sein Befehl auf und ich bekomme dann die PID des letzten Befehles, also die falsche. Falls ich mir das so richtig zusammenreime und es überhaupt möglich ist, dass sich 2 und mehr Scripts gegenseitig reinpfuschen.

Gruß Pir

anda_skoa
25-11-2004, 16:27
Du musst den Wert nur nach dem Starten in einer anderen Variable ablegen.

Solange dazwischen nichts Neues startest, passt der Wert auch, ein anderes Script hat seine eigenen Variablen, da wird nix überschrieben.

Ciao,
_

peschmae
25-11-2004, 21:34
Genau, denn die Variablen hat jede Shell für sich. Nichts mit teilen da ;)
D.h. solange du nichts startest geht das.

MfG Peschmä

pir
26-11-2004, 07:12
Es könnten aber trotzdem zwei Scripts in einer Shell laufen ( siehe &). Und dann könnte es schon zu dem von mir erwähnten Problem kommen, oder?

Gruß Pir

anda_skoa
26-11-2004, 09:46
Es könnten aber trotzdem zwei Scripts in einer Shell laufen ( siehe &). Und dann könnte es schon zu dem von mir erwähnten Problem kommen, oder?

Darum speichert man sich den Wert auch nach dem Starten des Kindprozesses, bevor man den nächsten Kindprozess startet.

Also zb


#!/bin/bash
befehl1 &
PID1=$!

befehl2&
PID2=$1!


Ciao,
_

pir
30-11-2004, 15:33
Also noch einmal ganz klar was ich will:

Es laufen 2 Scripts parallel , somit habe ich keinen Einfluss darauf welcher Befehl in diesem Script wann ausgeführt wird. Beide Scripts enthalten verschiedene Befehle und bei irgendeinem Befehl will ich dann die PID wissen (der Befehl befindet sich im Script drinnen, von wo er aufgerufen wird (mit oder ohne &)). Die beinden Scripts laufen in der gleichen Shell.

Meine Frage wie vorhin lautet:
Zwei Scripts in einer Shell per & aufgerufen ... könnte es zu dem von mir erwähnten Problem kommen (dass ich die PID eines anderen Befehles bekomme als dessen nach dem ich PID=$! geschrieben habe)?

Gruß Pir

anda_skoa
02-12-2004, 13:19
Jedes Script ist ja eine Shell für sich (außer es wird gesourced), d.h. innerhalb eines Scripts läuft alles unabhängig von irgendwelchen anderen Scripts ab.

Wenn du die PID in der übergeordneten Shell brauchst, wirst du mit dieser kommunizieren müssen.

Zum Beispiel in dem das untergeordnete Script etwas in den Output oder Error Stream schreibt, oder in eine Datei oder in ein FIFO

Ciao,
_