2010-11-23 20 views
3

J'ai besoin d'aide pour écrire une commande qui sera placée dans un fichier .sh. Je veux retourner le numéro de processus, qui dans la sortie ci-dessous est 3678, mais je vais avoir diffuclty parce que les changements de process id chaque fois qu'il obtient redémarré, donc mon code cassecomment obtenir l'id de processus pour un processus java à la ligne de commande dans freeBSD, sh

Sortie:

[[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 ce que je faisais jusqu'à ce que je compris la colonne changé lorsque le pid a changé:

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

Toute aide est appréciée. Merci.

+0

Vous voulez que le programme Java retourner son pid à la fin de l'exécution? Ou le script shell pour retourner le pid du programme Java après la sortie du programme Java? – vpit3833

+0

le programme shell. Le programme java sera toujours en cours d'exécution, ceci est juste un script shell pour obtenir le pid – Ronedog

Répondre

1

Une façon peut être trouvée dans: man pgrep

+0

pouvez-vous me montrer le code? – Ronedog

+1

@Ronedog: 'pgrep -U www java' –

+1

@Ronedog - les informations dont vous avez besoin se trouvent dans la saisie manuelle. Lis le. –

1

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

  1. Comment puis-je obtenir un identifiant de processus donné un nom de processus? Ou, comment puis-je trouver si un processus est toujours en cours d'exécution, compte tenu d'un ID de processus?

    Il n'y a pas de manière fiable de le faire de manière portative dans le shell. Certains systèmes réutilisent les identifiants de processus à la manière des descripteurs de fichiers. C'est-à-dire, ils utilisent le pid numéroté le plus bas qui n'est pas actuellement utilisé lors du démarrage d'un nouveau processus. Cela signifie que le pid que vous cherchez est là, mais il se peut qu'il ne se réfère pas au processus auquel vous pensez qu'il le fait.

    L'approche habituelle consiste à analyser la sortie de ps, mais qui implique une condition de course, puisque le pid vous trouvez cette façon ne peut pas se référer à le même processus quand vous fait quelque chose avec cette pid. Cependant, il n'y a pas de bonne solution dans un script shell, alors il est conseillé de prendre un piège.

    Une suggestion est d'utiliser pgrep si sur Solaris et « ps h -o pid C $ STRING » sinon, et votre ps soutient que la syntaxe, mais aucun de ceux qui sont parfaits ou omniprésentes.

    La solution normale lors de l'écriture de programmes C est de créer un fichier pid , puis de le verrouiller avec fcntl (2). Ensuite, si un autre programme veut savoir si ce programme est vraiment en cours d'exécution, il peut tenter de verrouiller le fichier . Si la tentative de verrouillage échoue, alors il sait le fichier est toujours en cours d'exécution.

    Nous n'avons pas d'options dans le shell comme cela, sauf si nous pouvons fournir un programme C qui peut essayer le verrou pour le script. Même ainsi, la condition de concurrence décrite ci-dessus existe toujours.

Cela dit regarder ceci: http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html il pourrait vous aider?

+0

merci, ce lien m'a donné ce dont j'avais besoin. J'apprécie votre explication, cela m'a aidé à comprendre cela un peu mieux. Je suis le seul sur le serveur et il n'y a que 2 programmes Java qui fonctionnent ... Je vais voir comment ça se passe. – Ronedog

12

Si le démarrage est automatisé par un script shell, vous pouvez écrire le pid du processus just-started qui se trouve dans la variable $!.

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

Lorsque vous avez besoin de le tuer, il suffit de faire:

kill `cat myjavaprogram.pid` 
2

Ci-dessous pgrep commande fonctionne pour obtenir pid par nom jar fichier:

pgrep -f test-app.jar