Comment un script Linux / Unix Bash connaît-il son propre PID?


150

J'ai un script dans Bash appelé Script.sh, et il a besoin de connaître son propre PID (c'est-à-dire que j'ai besoin d'obtenir le PID dans le Script.sh)

Une idée comment faire cela?

Réponses:



66

utiliser $BASHPIDou$$

Consultez le manuel pour plus d'informations, y compris les différences entre les deux.

TL; DRTFM

  • $$ S'étend à l'ID de processus du shell.
    • Dans un ()sous - shell, il s'étend à l'ID de processus du shell appelant, et non au sous-shell.
  • $BASHPID S'étend à l'ID de processus du processus Bash actuel.
    • Dans un ()sous - shell, il se développe en l'ID de processus du sous-shell

10
Notez que $$ et BASHPID ne sont pas toujours la même chose - le manuel le mentionne, et il y a un exemple plus concret ici: tldp.org/LDP/abs/html/internalvariables.html . La distinction peut être assez importante, car beaucoup de constructions bash fonctionnent dans des sous-interpréteurs.
Cascabel

@Jefromi - noté. C'était l'une des raisons pour lesquelles j'ai lié au manuel.
tvanfosson

2
Il convient de noter que $BASHPIDc'est nouveau dans BASH 4. Si vous utilisez BASH 3.x, vous devez utiliser$$
Bruno Bronosky

37

En plus de l'exemple donné dans le Advanced Bash Scripting Guide référencé par Jefromi , ces exemples montrent comment les tubes créent des sous-shell:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

pourriez-vous expliquer ce que signifie «<<<»? Merci.
Sopalajo de Arrierez

4
Il redirige une chaîne dans la boucle (ou tout ce qui lit stdin). La chaîne est appelée "chaîne ici".
Suspendu jusqu'à nouvel ordre.

8

Le PID est stocké dans $$.

Exemple: kill -9 $$tuera l'instance du shell à partir de laquelle elle est appelée.


kill -9(avec -9indicateur) est considéré comme nocif et ne doit être utilisé que si cela est absolument nécessaire).
Willem Van Onsem

3
Il est considéré comme «dangereux» car le processus n'a pas la possibilité de répondre au signal (et éventuellement de se nettoyer après lui-même). Faire kill -9 $$exactement 1 chose. Il tue le processus shell actuel . Ceci est utile si vous avez fait quelque chose dans la session shell que vous ne voulez pas écrire .bash_historycomme:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

Si le processus est un processus enfant et que $ BASHPID n'est pas défini, il est possible d'interroger le ppid d'un processus enfant créé du processus en cours d'exécution. C'est peut-être un peu moche, mais ça marche. Exemple:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.