¿Cómo sabe un script de Linux / Unix Bash su propio PID?

150

Tengo un script en Bash llamado Script.sh, y necesita saber su propio PID (es decir, necesito obtener el PID dentro del Script.sh)

Alguna idea de cómo se hace esto ?

Depurador
fuente

Respuestas:

234

La variable '$$' contiene el PID.

Paul Tomblin
fuente
66

usar $BASHPIDo$$

Consulte el manual para obtener más información, incluidas las diferencias entre los dos.

TL; DRTFM

  • $$ Se expande a la ID de proceso del shell.
    • En un ()subshell, se expande al ID de proceso del shell de invocación, no al subshell.
  • $BASHPID Se expande al ID de proceso del proceso Bash actual.
    • En una ()subshell, se expande al ID de proceso de la subshell
tvanfosson
fuente
10
Tenga en cuenta que $$ y BASHPID no siempre son lo mismo: el manual menciona esto, y hay un ejemplo más concreto aquí: tldp.org/LDP/abs/html/internalvariables.html . La distinción puede ser bastante importante, ya que muchas construcciones de bash se ejecutan en subcapas.
Cascabel
@Jefromi - señaló. Esa fue una de las razones que vinculé al manual.
tvanfosson
2
Cabe señalar que $BASHPIDes nuevo en BASH 4. Si está usando BASH 3.x, debe usar$$
Bruno Bronosky
37

Además del ejemplo dado en la Guía avanzada de secuencias de comandos Bash a la que hace referencia Jefromi , estos ejemplos muestran cómo las tuberías crean subcapas:

$ 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 hasta nuevo aviso.
fuente
¿podría explicar qué significa "<<<"? Gracias.
Sopalajo de Arrierez
44
Redirige una cadena al bucle (o cualquier cosa que se lea stdin). La cadena se conoce como una "cadena aquí".
Pausado hasta nuevo aviso.
8

El PID se almacena en $$.

Ejemplo: kill -9 $$matará la instancia de shell desde la que se llama.

neo
fuente
kill -9(con -9bandera) se considera dañino y solo se debe usar si es absolutamente necesario).
Willem Van Onsem
3
Se considera "peligroso" porque el proceso no tiene la oportunidad de responder a la señal (y posiblemente limpiar después de sí mismo). Hacer kill -9 $$hace exactamente 1 cosa. Mata el proceso actual de shell . Esto es útil si ha hecho algo en la sesión de shell que no desea escribir en .bash_historyMe gusta:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky
4

Puedes usar la $$variable.

Klaus Byskov Pedersen
fuente
0

Si el proceso es un proceso secundario y $ BASHPID no está configurado, es posible consultar el ppid de un proceso secundario creado del proceso en ejecución. Puede ser un poco feo, pero funciona. Ejemplo:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Joakim J. Rapp
fuente