Comment obtenir le pid de la dernière commande exécutée dans un script shell?

254

Je veux avoir un script shell comme ceci:

my-app &
echo $my-app-pid

Mais je ne sais pas comment obtenir le pid de la commande qui vient d'être exécutée.

Je sais que je peux simplement utiliser la jobs -p my-appcommande pour grep le pid. Mais si je veux exécuter le shell plusieurs fois, cette méthode ne fonctionnera pas. Parce que le jobpec est ambigu.

David S.
la source

Réponses:

338

Le PID de la dernière commande exécutée est dans la $!variable shell:

my-app &
echo $!
enzotib
la source
1
C'est l'impression pid comme par exemple. [1] 893. Je veux seulement un numéro.
user3153014
33
Il convient de noter qu'il s'agit de programmes démarrés en arrière-plan . Si aucun processus en arrière-plan n'a été démarré, le paramètre n'est pas défini.
Ramrunner
5
Une autre solution intéressante est suggérée dans (un commentaire à une réponse à). Comment obtenir le processus en cours : oh, et le "seul": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 nov. '10 à 14h28
imz - Ivan Zakharyaschev
14
@ user3153014 Les chaînes telles que "[2] 2625" sont imprimées par le shell après le démarrage de la tâche en arrière-plan. Ceci n'est pas lié à la sortie deecho $!
Petr Gladkikh
J'utilise habituellement ce code dans un script lorsque je dois attendre la fin du processus. my-app & myVar=$! ; fg. fgramène le processus à l'avant-plan. Je peux ensuite imprimer echo $myVarplus tard et je suis à peu près sûr que l'application my-app est déjà terminée.
Vrata Blazek
66

Obtenez PID:

#!/bin/bash
my-app &
echo $!

Enregistrer PIDdans la variable:

#!/bin/bash
my-app &
export APP_PID=$!

Enregistrez toutes les occurrences PIDdans un fichier texte:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

Enregistrer la sortie, les erreurs et PIDdans des fichiers séparés:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"
Eduardo Cuomo
la source
3
La question ne concernait pas la redirection. Votre réponse est donc à peu près la même que celle acceptée, sauf que si une instance de my-appfinitions et peut-être même pire, son PID est réutilisé plus tard, vous aurez de mauvaises informations dans votre fichier. Je ne pense pas que cette réponse ajoute vraiment beaucoup de valeur à la réponse acceptée existante
Eric Renouf
@EricRenouf post mis à jour!
Eduardo Cuomo
un autre dérivé qui pourrait être utile. Cela donne le PID et le traite en même temps comme un processus (principalement) de premier plan: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe
N'est-ce pas APP = main &un moyen de récupérer le PID?
MrMesees
3

Essayez quelque chose comme

pidof my_app >> /tmp/my_app.pid
Piyush Jain
la source
1
commande externe, et lente, si le système peut donner directement à PID pourquoi chercher dans tous les processus pour trouver cela? et aussi, je ne peux pas être certain que vous aurez la bonne valeur
papo
-4

Essayez quelque chose comme ça:

 ps ef | grep "[m]y-app" | awk '{print $2}'

En plaçant la première lettre de votre processus entre les deux, [ ]vous vous assurez que le grepprocessus ne figure pas dans votre liste. Si nécessaire, vous pouvez également ajouter un grep sur votre nom d'utilisateur.

Goez
la source
9
C'est très fragile au mieux et ça ne marche pas si my-appon l'exécute plus d'une fois - davidshen84 s'inquiète spécifiquement de ce cas.
Mat
2
Si vous choisissez même cette voie, vous devriez utiliser à la pgrepplace.
Willem