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ć?

Odpowiedzi:



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

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

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.


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


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 "$!")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.