Woher kennt ein Linux / Unix Bash-Skript seine eigene PID?

149

Ich habe ein Skript in Bash mit dem Namen Script.shund es muss seine eigene PID kennen (dh ich muss die PID in Script.sh erhalten).

Irgendeine Idee, wie das geht?

Debugger
quelle

Antworten:

234

Die Variable '$$' enthält die PID.

Paul Tomblin
quelle
65

benutze $BASHPIDoder$$

Weitere Informationen, einschließlich der Unterschiede zwischen den beiden, finden Sie im Handbuch .

TL; DRTFM

  • $$ Erweitert sich auf die Prozess-ID der Shell.
    • In einer ()Subshell wird die Prozess-ID der aufrufenden Shell und nicht die Subshell erweitert.
  • $BASHPID Wird auf die Prozess-ID des aktuellen Bash-Prozesses erweitert.
    • In einer ()Subshell wird die Prozess-ID der Subshell erweitert
Tvanfosson
quelle
10
Beachten Sie, dass $$ und BASHPID nicht immer dasselbe sind - das Handbuch erwähnt dies, und hier gibt es ein konkreteres Beispiel: tldp.org/LDP/abs/html/internalvariables.html . Die Unterscheidung kann ziemlich wichtig sein, da viele Bash-Konstrukte in Subshells ausgeführt werden.
Cascabel
@ Jefromi - notiert. Das war einer der Gründe, warum ich mit dem Handbuch verlinkt habe.
Tvanfosson
2
Es sollte beachtet werden, dass $BASHPIDBASH 4 neu ist. Wenn Sie BASH 3.x verwenden, müssen Sie$$
Bruno Bronosky
36

Zusätzlich zu dem Beispiel im Advanced Bash Scripting Guide, auf das Jefromi verweist , zeigen diese Beispiele, wie Pipes Subshells erstellen:

$ 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
Bis auf weiteres angehalten.
quelle
Könnten Sie bitte erklären, was "<<<" bedeutet? Vielen Dank.
Sopalajo de Arrierez
4
Es leitet eine Zeichenfolge in die Schleife um (oder alles, was liest stdin). Die Zeichenfolge wird als "Hier-Zeichenfolge" bezeichnet.
Bis auf weiteres angehalten.
8

Die PID wird in gespeichert $$.

Beispiel: kill -9 $$Beendet die Shell-Instanz, von der aus sie aufgerufen wird.

Neo
quelle
kill -9(mit -9Flagge) gilt als schädlich und darf nur verwendet werden, wenn dies unbedingt erforderlich ist.
Willem Van Onsem
3
Es wird als "gefährlich" angesehen, da der Prozess keine Chance bekommt, auf das Signal zu reagieren (und möglicherweise nach sich selbst aufzuräumen). Tun kill -9 $$macht genau eine Sache. Es beendet den aktuellen Shell-Prozess . Dies ist nützlich, wenn Sie in der Shell-Sitzung etwas getan haben, an das Sie nicht schreiben möchten .bash_history:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky
4

Sie können die $$Variable verwenden.

Klaus Byskov Pedersen
quelle
0

Wenn der Prozess ein untergeordneter Prozess ist und $ BASHPID nicht festgelegt ist, kann die ppid eines erstellten untergeordneten Prozesses des laufenden Prozesses abgefragt werden. Es mag ein bisschen hässlich sein, aber es funktioniert. Beispiel:

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