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 ?

Depurador
fonte

Respostas:

234

A variável '$$' contém o PID.

Paul Tomblin
fonte
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
tvanfosson
fonte
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
Pausado até novo aviso.
fonte
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.

neo
fonte
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
4

Você pode usar a $$variável

Klaus Byskov Pedersen
fonte
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 "$!")
Joakim J. Rapp
fonte