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?

Antworten:



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

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

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.


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


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 "$!")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.