Como um script Linux / Unix Bash conhece seu próprio PID?


149

Eu tenho um script no Bash chamado Script.sh e ele precisa conhecer seu próprio PID (ou seja, eu preciso obter o PID dentro do Script.sh)

Alguma idéia de como fazer isso ?

Respostas:



65

use $BASHPIDou$$

Consulte o manual para obter mais informações, incluindo diferenças entre os dois.

TL; DRTFM

  • $$ Expande para o ID do processo do shell.
    • Em um ()subshell, ele se expande para o ID do processo do shell de chamada, não para o subshell.
  • $BASHPID Expande para o ID do processo Bash atual.
    • Em um ()subshell, ele se expande para o ID do processo do subshell

10
Observe que $$ e BASHPID nem sempre são a mesma coisa - o manual menciona isso e há um exemplo mais concreto aqui: tldp.org/LDP/abs/html/internalvariables.html . A distinção pode ser bastante importante, pois muitas construções bash são executadas em subcascas.
Cascabel

@Jefromi - observou. Essa foi uma das razões pelas quais vinculei ao manual.
tvanfosson

2
Deve-se notar que $BASHPIDé novo para bater 4. Se você estiver usando BASH 3.x, você tem que usar$$
de Bruno Bronosky

36

Além do exemplo dado no Advanced Bash Scripting Guide referido pelo Jefromi , estes exemplos mostram como os pipes criam subshells:

$ 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

você poderia explicar o que significa "<<<"? Obrigado.
Sopalajo de Arrierez 29/03

4
Ele redireciona uma string para o loop (ou qualquer coisa que lê stdin). A cadeia é referida como uma "cadeia aqui".
Pausado até novo aviso.

8

O PID é armazenado em $$.

Exemplo: kill -9 $$matará a instância do shell da qual é chamada.


kill -9(com -9bandeira) é considerado nocivo e só deve ser usado se for absolutamente necessário).
Willem Van Onsem 15/09/2015

3
É considerado "perigoso" porque o processo não tem a chance de responder ao sinal (e possivelmente limpar depois de si mesmo). Fazer kill -9 $$faz exatamente 1 coisa. Isso mata o processo atual do shell . Isso é útil se você tiver feito algo na sessão shell que não deseja que seja escrito .bash_historycomo:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky 19/17


0

Se o processo for um processo filho e $ BASHPID não estiver definido, é possível consultar o ppid de um processo filho criado do processo em execução. Pode ser um pouco feio, mas funciona. Exemplo:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.