W jaki sposób skrypt Bash systemu Linux / Unix zna swój własny PID?

149

Mam skrypt o nazwie Bash Script.shi musi on znać swój własny PID (tj. Muszę uzyskać PID w Script.sh)

Masz jakiś pomysł, jak to zrobić?

Debugger
źródło

Odpowiedzi:

234

Zmienna „$$” zawiera PID.

Paul Tomblin
źródło
65

użyj $BASHPIDlub$$

Więcej informacji, w tym różnice między nimi, znajdziesz w instrukcji .

TL; DRTFM

  • $$ Rozwija się do identyfikatora procesu powłoki.
    • W ()podpowłoce rozwija się do identyfikatora procesu powłoki wywołującej, a nie podpowłoki.
  • $BASHPID Rozwija się do identyfikatora procesu bieżącego procesu Bash.
    • W ()podpowłoce rozwija się do identyfikatora procesu podpowłoki
tvanfosson
źródło
10
Zwróć uwagę, że $$ i BASHPID nie zawsze są tym samym - wspomina o tym podręcznik, a tutaj jest bardziej konkretny przykład: tldp.org/LDP/abs/html/internalvariables.html . To rozróżnienie może być bardzo ważne, ponieważ wiele konstrukcji basha działa w podpowłokach.
Cascabel
@Jefromi - zanotowano. To był jeden z powodów, dla których połączyłem się z instrukcją.
tvanfosson
2
Należy zauważyć, że $BASHPIDjest to nowość w BASH 4. Jeśli używasz BASH 3.x, musisz użyć$$
Bruno Bronosky
36

Oprócz przykładu podanego w Advanced Bash Scripting Guide, do którego odwołuje się Jefromi , poniższe przykłady pokazują, jak potoki tworzą podpowłoki:

$ 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
Wstrzymano do odwołania.
źródło
czy mógłbyś wyjaśnić, co oznacza „<<<”? Dzięki.
Sopalajo de Arrierez
4
Przekierowuje ciąg do pętli (lub cokolwiek, co czyta stdin). Ciąg jest nazywany „ciągiem tutaj”.
Wstrzymano do odwołania.
8

PID jest przechowywany w $$.

Przykład: kill -9 $$zabije instancję powłoki, z której jest wywoływana.

neo
źródło
kill -9(z -9flagą) jest uważane za szkodliwe i powinno być używane tylko wtedy, gdy jest to absolutnie konieczne).
Willem Van Onsem
3
Jest uważany za „niebezpieczny”, ponieważ proces nie ma szansy odpowiedzieć na sygnał (i prawdopodobnie po sobie wyczyścić). Robi kill -9 $$dokładnie 1 rzecz. Zabija bieżący proces powłoki . Jest to przydatne, jeśli zrobiłeś coś w sesji powłoki, o której nie chcesz pisać .bash_history:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky
4

Możesz użyć $$zmiennej.

Klaus Byskov Pedersen
źródło
0

Jeśli proces jest procesem potomnym, a $ BASHPID nie jest ustawione, można zapytać o ppid utworzonego procesu potomnego działającego procesu. To może być trochę brzydkie, ale działa. Przykład:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Joakim J. Rapp
źródło