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

Je veux avoir un script shell comme celui-ci:

my-app & echo $my-app-pid 

Mais je le fais 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 commande jobs -p my-app pour grep le pid. Mais si je veux exécuter le shell plusieurs fois, cette méthode ne fonctionnera pas. Parce que le jobspec est ambigu.

Answer

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

my-app & echo $! 

Commentaires

  • Il imprime pid comme par exemple. [1] 893. Je ne veux que des chiffres.
  • Il convient de noter que cela signifie des programmes démarrés en arrière-plan . Si aucun processus darrière-plan na été lancé, le paramètre nest pas défini.
  • Une autre solution intéressante est suggérée dans (un commentaire sur une réponse à) Comment obtenir le pid du processus qui vient de démarrer : oh, et le " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 novembre ' 10 à 14:28
  • @ user3153014 Chaîne du type " [2] 2625 " sont imprimés par le shell après le démarrage de la tâche darrière-plan. Ceci nest pas lié à la sortie de echo $!
  • Jutilise généralement ce code dans un script lorsque je dois attendre la fin du processus. my-app & myVar=$! ; fg. fg ramène le processus au premier plan. Je peux ensuite imprimer echo $myVar plus tard et je ' suis presque sûr que mon-application est déjà terminée.

Réponse

Obtenir PID:

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

Enregistrer PID dans la variable:

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

Enregistrer toutes les instances PID dans un fichier texte:

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

Enregistrer la sortie, les erreurs et PID dans 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)" 

Commentaires

  • La question didn ' t poser des questions sur la redirection, alors votre réponse est la plupart du temps la même que celle acceptée sauf que si une instance de my-app se termine, et peut-être même pire que son PID est réutilisé plus tard, vous ' aura de mauvaises informations dans votre fichier. Je ' ne pense pas que cette réponse ajoute beaucoup de valeur à la réponse acceptée existante
  • @EricRenouf post mis à jour!
  • un autre dérivé qui pourrait être utile. Cela obtient 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 $? `
  • isnt APP = main & un moyen de récupérer le PID?

Réponse

Essayez quelque chose comme

pidof my_app >> /tmp/my_app.pid 

Commentaires

  • commande externe, et lente, si le système peut donner directement PID pourquoi rechercher dans tous les processus pour trouver exactement cela ? et peut ' être certain que vous ' obtiendrez la valeur correcte

Réponse

Essayez quelque chose comme ceci:

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

Placer la première lettre de votre processus entre [ ] sassure que vous nobtenez pas le processus grep dans votre liste. Si nécessaire, vous pouvez également ajouter un grep à votre nom dutilisateur.

Commentaires

  • Ce ' est très fragile au mieux et ne ' t fonctionne si my-app est exécuté plus d’une fois – davidshen84 s’inquiète spécifiquement de cela cas.
  • Si vous suivez même cette voie, utilisez plutôt pgrep.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *