Как сценарий Linux / Unix Bash знает свой собственный PID?

150

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

Есть идеи как это сделать ?

дебаггер
источник

Ответы:

234

Переменная $$ содержит PID.

Пол Томблин
источник
66

использовать $BASHPIDили$$

См. Руководство для получения дополнительной информации, включая различия между ними.

TL; DRTFM

  • $$ Расширяется до идентификатора процесса оболочки.
    • В ()подоболочке он расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки.
  • $BASHPID Расширяется до идентификатора текущего процесса Bash.
    • В ()подоболочке он расширяется до идентификатора процесса подоболочки
tvanfosson
источник
10
Обратите внимание, что $$ и BASHPID не всегда одно и то же - руководство упоминает об этом, и здесь есть более конкретный пример: tldp.org/LDP/abs/html/internalvariables.html . Различие может быть довольно важным, так как многие конструкции bash работают в подоболочках.
Каскабель
@Jefromi - отметил. Это была одна из причин, по которой я связался с руководством.
tvanfosson
2
Следует отметить, что $BASHPIDэто новинка для BASH 4. Если вы используете BASH 3.x, вы должны использовать$$
Бруно Броноски
37

В дополнение к примеру, приведенному в Advanced Bash Scripting Guide, на который ссылается 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
Приостановлено до дальнейшего уведомления.
источник
Не могли бы вы объяснить, что означает «<<<»? Спасибо.
Сопалайо де Арриерес
4
Он перенаправляет строку в цикл (или все, что читает stdin). Строка называется «здесь строка».
Приостановлено до дальнейшего уведомления.
8

PID хранится в $$.

Пример: kill -9 $$уничтожит экземпляр оболочки, из которой он вызван.

нео
источник
kill -9-9флагом) считается вредным и используется только в случае крайней необходимости).
Виллем Ван Онсем
3
Это считается «опасным», потому что процесс не получает возможности ответить на сигнал (и, возможно, очистить после себя). Делать kill -9 $$делает ровно 1 вещь. Это убивает текущий процесс оболочки . Это полезно, если вы сделали что-то в сеансе оболочки, которое вы не хотите записывать в .bash_historyLike:docker run -e PASSWORD=hunter2 ircbot
Бруно Броноски
4

Вы можете использовать $$переменную.

Клаус Бысков Педерсен
источник
0

Если процесс является дочерним процессом, а $ BASHPID не задан, можно запросить ppid созданного дочернего процесса запущенного процесса. Это может быть немного некрасиво, но это работает. Пример:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Йоаким Дж. Рапп
источник