2010-11-23 5 views
3

Ich brauche Hilfe beim Schreiben eines Befehls, der in eine .sh. Ich mag den Prozess-ID zurück, die weiter unten in der Ausgabe 3678 ist, aber ich habe diffuclty weil die Prozess-ID ändert jedes Mal erneut gestartet wird, so mein Code brichtWie bekomme ich die Prozess-ID für einen Java-Prozess an der Kommandozeile in FreeBSD, sh

Ausgang:

[[email protected] /usr/home/aaron]# ps -xauww | grep java | grep www 
www  3678 0.0 3.2 1308176 267864 ?? Is 3:21PM 0:17.19 [java] 
[[email protected] /usr/home/aaron]# 

Heres was ich tat, bis ich die Säule realisiert geändert, wenn die pid geändert:

ps -xauww | grep java | grep www | cut -d" " -f6 

Jede Hilfe sehr geschätzt wird. Vielen Dank.

+0

Sie wollen das Java-Programm am Ende der Ausführung seine PID zurückgeben? Oder das Shell-Skript, das die PID des Java-Programms zurückgibt, nachdem das Java-Programm beendet wurde? – vpit3833

+0

das Shell-Programm. Das Java-Programm wird immer ausgeführt, dies ist nur ein Shell-Skript, um die PID – Ronedog

Antwort

1

Ein Weg zu finden in: man pgrep

+0

können Sie mir den Code zeigen? – Ronedog

+1

@Ronedog: 'pgrep -U www java' –

+1

@Ronedog - die Informationen, die Sie benötigen, sind in der manuellen Eingabe. Lies es. –

1

Per http://cfajohnson.com/shell/cus-faq-2.html

  1. Wie erhalte ich einen Prozess-ID ein Prozess Namen gegeben? Oder, wie finde ich heraus, wenn ein Prozess noch läuft, eine Prozess-ID gegeben?

    Es gibt keine zuverlässige Möglichkeit, dies portabel in der Shell. Einige Systeme verwenden Prozess-IDs ähnlich wie Dateideskriptoren. Das heißt, Sie verwenden die PID mit der niedrigsten Nummer, die derzeit nicht verwendet wird beim Starten eines neuen Prozesses. Das bedeutet, dass die PID, die du suchst, ist, aber nicht auf den Prozess verweist, den du denkst es tut.

    Die übliche Vorgehensweise ist die Ausgabe von ps zu analysieren, aber das beinhaltet eine Race-Bedingung, da die pid Sie auf diese Weise finden kann nicht den gleichen Prozess beziehen, wenn Sie tatsächlich mit diesem pid etwas tun. Es gibt jedoch keinen guten Weg, das in einem Shell-Skript zu finden, also sei darauf hingewiesen, dass du vielleicht in eine Falle gehst.

    Ein Vorschlag ist, auf Solaris verwenden pgrep wenn und ‚ps h -o pid -C $ STRING‘, wenn nicht, und Ihre ps unterstützt die Syntax, aber keiner von diejenigen sind perfekt oder allgegenwärtig.

    Die normale Lösung beim Schreiben von C-Programmen besteht darin, eine pid Datei zu erstellen und sie dann mit fcntl (2) zu sperren. Wenn dann ein anderes Programm wissen möchte, ob das Programm wirklich läuft, kann es versuchen, eine Sperre für die Datei zu erlangen. Wenn der Lock-Versuch fehlschlägt, dann weiß er die Datei läuft noch.

    Wir haben keine Optionen in der Shell so, es sei denn, wir können ein C-Programm liefern, das die Sperre für das Skript versuchen kann. Trotzdem existiert die oben beschriebene Wettlaufbedingung immer noch.

That being said Blick auf diese: http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html es Ihnen helfen könnte?

+0

danke, dieser Link hat mir, was ich brauchte. Ich schätze Ihre Erklärung, es hat mir geholfen, dies ein bisschen besser zu verstehen. Ich bin der einzige auf dem Server und es gibt nur 2 Java-Programme, die laufen ... ich werde sehen, wie das geht. – Ronedog

12

Wenn der Start von einem Shell-Skript automatisiert wird, können Sie die PID des gerade gestarteten Prozesses schreiben, die in der Variablen $! steht.

java ...... & 
echo "$!" > myjavaprogram.pid 

Wenn Sie es töten müssen, tun gerade:

kill `cat myjavaprogram.pid` 
2

Below pgrep Befehl funktioniert für JAR-Dateinamen pid bekommen:

pgrep -f test-app.jar

Verwandte Themen