it-swarm.com.de

in Shell pid bekommen (bash)

Ich habe ein Problem mit Bash und ich weiß nicht warum.
Unter Shell gebe ich ein:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"getpid" ist ein C-Programm zum Abrufen der aktuellen PID wie:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

Was mich verwirrt ist, dass:

  1. Ich denke, "(Befehl)" ist ein Unterprozess (habe ich Recht?), Und ich denke, seine PID sollte mit seiner übergeordneten PID unterschiedlich sein, aber sie sind gleich, warum ...
  2. wenn ich mein Programm benutze, um PID in Klammern anzuzeigen, ist die angezeigte PID unterschiedlich. Stimmt das?
  3. ist '$$' so etwas wie ein Makro?

Können Sie mir helfen?

132
ruanhao

$$ gibt die Prozess-ID des übergeordneten Elements in einer Subshell zurück. von der Manpage unter "Special Parameters":

$ Wird auf die Prozess-ID der Shell erweitert. In einer () - Subshell wird die Prozess-ID der aktuellen Shell und nicht der Subshell angegeben.

In bash 4 können Sie die Prozess-ID des untergeordneten Objekts mit BASHPID abrufen.

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
183
chepner

Sie können eine der folgenden Optionen verwenden.

  • $! ist die PID des letzten Hintergrundprozesses.
  • kill -0 $PID prüft, ob es noch läuft.
  • $$ ist die PID der aktuellen Shell.
75
craken
  1. Klammern rufen ein nterschale in Bash auf. Da es sich nur um eine Subshell handelt, hat sie möglicherweise dieselbe PID - abhängig von der Implementierung.
  2. Das von Ihnen aufgerufene C-Programm ist ein separater Prozess, der eine eigene eindeutige PID hat - egal, ob es sich um eine Subshell handelt oder nicht.
  3. $$ ist ein Alias ​​in Bash to die aktuelle Skript-PID . Siehe nterschiede zwischen $$ und $BASHPID hier und rechts darüber die zusätzliche Variable $BASH_SUBSHELL, das die Verschachtelungsebene enthält.
24

Versuchen Sie getppid(), wenn Ihr C-Programm die PID Ihrer Shell drucken soll.

4
Alex

Wenn Sie sich fragen, wie die PID eines bekannten Befehls ermittelt werden soll, sieht sie ungefähr so ​​aus:

Wenn Sie den folgenden Befehl eingegeben haben: #Der eingegebene Befehl war ***

dd if =/dev/diskx von =/dev/disky


Dann würden Sie verwenden:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

Was hier passiert, ist, dass alle benötigten eindeutigen Zeichen an ein Feld weitergeleitet werden und dieses Feld mit Echo wiedergegeben werden kann

echo $ PIDs

1

dies ist ein einzigartiger Weg, um die richtige PID zu erhalten

pid=$(cut -d' ' -f4 < /proc/self/stat)

selbe Nice arbeitete für sub

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

ausgang prüfen

pid = 8099
8099 != 8100
0
ARTEM LAPKIN