Come fa uno script Linux / Unix Bash a conoscere il proprio PID?


150

Ho uno script in Bash chiamato Script.sh, e deve conoscere il proprio PID (cioè ho bisogno di ottenere PID all'interno di Script.sh)

Qualche idea su come farlo?

Risposte:



66

uso $BASHPID o$$

Vedere il manuale per ulteriori informazioni, comprese le differenze tra i due.

TL; DRTFM

  • $$ Si espande nell'ID processo della shell.
    • In una ()subshell, si espande nell'ID del processo della shell che invoca, non nella subshell.
  • $BASHPID Si espande nell'ID processo del processo Bash corrente.
    • In una ()subshell, si espande nell'ID processo della subshell

10
Notare che $$ e BASHPID non sono sempre la stessa cosa - il manuale menziona questo, e qui c'è un esempio più concreto: tldp.org/LDP/abs/html/internalvariables.html . La distinzione può essere piuttosto importante, dato che molti costrutti bash sono eseguiti in subshells.
Cascabel,

@Jefromi - notato. Questo è stato uno dei motivi che ho collegato al manuale.
tvanfosson,

2
Va notato che $BASHPIDè una novità di BASH 4. Se si utilizza BASH 3.x, è necessario utilizzare$$
Bruno Bronosky

37

Oltre all'esempio fornito nella Guida avanzata agli script di Bash a cui fa riferimento Jefromi , questi esempi mostrano come le pipe creano sottostrutture:

$ 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

potresti spiegare cosa significa "<<<"? Grazie.
Sopalajo de Arrierez,

4
Reindirizza una stringa nel loop (o qualsiasi cosa legga stdin). La stringa viene definita "qui stringa".
In pausa fino a nuovo avviso.

8

Il PID è memorizzato in $$.

Esempio: kill -9 $$ucciderà l'istanza della shell da cui viene chiamata.


kill -9(con -9bandiera) è considerato dannoso e può essere utilizzato solo se è assolutamente necessario).
Willem Van Onsem,

3
È considerato "pericoloso" perché il processo non ha la possibilità di rispondere al segnale (e possibilmente ripulire dopo se stesso). Fare kill -9 $$fa esattamente 1 cosa. Uccide l' attuale processo di shell . Questo è utile se nella sessione di shell hai fatto qualcosa che non vuoi scrivere a .bash_historyMi piace:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky,


0

Se il processo è un processo figlio e $ BASHPID non è impostato, è possibile eseguire una query sul ppid di un processo figlio creato del processo in esecuzione. Potrebbe essere un po 'brutto, ma funziona. Esempio:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.