У мене є сценарій в Bash, який називається Script.sh
, і він повинен знати свій власний PID (тобто мені потрібно отримати PID всередині Script.sh)
Будь-яка ідея, як це зробити?
У мене є сценарій в Bash, який називається Script.sh
, і він повинен знати свій власний PID (тобто мені потрібно отримати PID всередині Script.sh)
Будь-яка ідея, як це зробити?
Відповіді:
Змінна '$$' містить PID.
використання $BASHPID
або$$
Додаткову інформацію, включаючи відмінності між ними, див. У посібнику .
TL; DRTFM
$$
Розширюється на ідентифікатор процесу оболонки.
()
підпакеті він розширюється на ідентифікатор процесу оболонки, що викликає, а не на нижню частину.$BASHPID
Розгортається до ідентифікатора процесу поточного процесу Bash.
()
підпакеті він розширюється до ідентифікатора процесу підпакеті$BASHPID
для BASH є новим. Якщо ви використовуєте BASH 3.x, вам доведеться скористатися$$
На додаток до прикладу, наведеного в Посібнику з розширеного сценарію 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
stdin
). Рядок позначається як "тут рядок".
PID зберігається в $$
.
Приклад: kill -9 $$
знищить екземпляр оболонки, з якого він викликаний.
kill -9
(з -9
прапором) вважається шкідливим і використовуватиметься лише тоді, коли це абсолютно необхідно).
kill -9 $$
це рівно 1 штука. Це вбиває поточний процес оболонки . Це корисно, якщо ви зробили щось під час сеансу оболонки, про яке ви не хочете, щоб написано на .bash_history
зразок:docker run -e PASSWORD=hunter2 ircbot
Можна використовувати $$
змінну.
Якщо процес є дочірнім процесом і $ BASHPID не встановлений, можна запитати ppid створеного дочірнього процесу запущеного процесу. Це може бути трохи некрасиво, але це працює. Приклад:
sleep 1 &
mypid=$(ps -o ppid= -p "$!")