Як сценарій Linux / Unix Bash знає власний PID?


149

У мене є сценарій в Bash, який називається Script.sh, і він повинен знати свій власний PID (тобто мені потрібно отримати PID всередині Script.sh)

Будь-яка ідея, як це зробити?

Відповіді:



65

використання $BASHPIDабо$$

Додаткову інформацію, включаючи відмінності між ними, див. У посібнику .

TL; DRTFM

  • $$ Розширюється на ідентифікатор процесу оболонки.
    • У ()підпакеті він розширюється на ідентифікатор процесу оболонки, що викликає, а не на нижню частину.
  • $BASHPID Розгортається до ідентифікатора процесу поточного процесу Bash.
    • У ()підпакеті він розширюється до ідентифікатора процесу підпакеті

10
Зауважте, що $$ та BASHPID - це не завжди одне і те ж - керівництво про це згадує, і тут є конкретніший приклад: tldp.org/LDP/abs/html/internalvariables.html . Відмінність може бути досить важливою, оскільки безліч баш-конструкцій працює в підпакеті.
Каскабель

@Jefromi - зазначив. Це було однією з причин, що я пов'язав із посібником.
tvanfosson

2
Зазначимо, що $BASHPIDдля BASH є новим. Якщо ви використовуєте BASH 3.x, вам доведеться скористатися$$
Бруно Броноскі,

36

На додаток до прикладу, наведеного в Посібнику з розширеного сценарію Bash, на який посилається Jefromi , у цих прикладах показано, як труби створюють підшарови:

$ 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

Ви можете пояснити, що означає "<<<"? Дякую.
Sopalajo de Arrierez

4
Він перенаправляє рядок у цикл (або все, що читається stdin). Рядок позначається як "тут рядок".
Призупинено до подальшого повідомлення.

8

PID зберігається в $$.

Приклад: kill -9 $$знищить екземпляр оболонки, з якого він викликаний.


kill -9-9прапором) вважається шкідливим і використовуватиметься лише тоді, коли це абсолютно необхідно).
Віллем Ван Онсем

3
Це вважається "небезпечним", оскільки процес не отримує шансу реагувати на сигнал (і, можливо, очищається після себе). Робити kill -9 $$це рівно 1 штука. Це вбиває поточний процес оболонки . Це корисно, якщо ви зробили щось під час сеансу оболонки, про яке ви не хочете, щоб написано на .bash_historyзразок:docker run -e PASSWORD=hunter2 ircbot
Бруно Броноський,


0

Якщо процес є дочірнім процесом і $ BASHPID не встановлений, можна запитати ppid створеного дочірнього процесу запущеного процесу. Це може бути трохи некрасиво, але це працює. Приклад:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.