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


150

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

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

Ответы:



66

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

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

TL; DRTFM

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

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
Бруно Броноски


0

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

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