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
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
.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 novembre ' 10 à 14:28echo $!
my-app & myVar=$! ; fg
.fg
ramène le processus au premier plan. Je peux ensuite imprimerecho $myVar
plus tard et je ' suis presque sûr que mon-application est déjà terminée.