2013-07-19 3 views
40

Ist es möglich, die untergeordnete Prozess-ID aus der übergeordneten Prozess-ID im Shell-Skript abzurufen?So erhalten Sie einen Child-Prozess vom übergeordneten Prozess

Ich habe eine Datei mit Shell-Skript ausführen, die zu einem neuen Prozess führt process1 (Parent-Prozess). Diese process1 hat einen anderen Prozess process2 (Kindprozess) gegabelt. Mit Skript, ich bin in der Lage, die pid von process1 mit dem Befehl zu erhalten:

cat /path/of/file/to/be/executed 

aber ich bin nicht in der Lage, die pid des Kind Prozesses zu holen.

+1

Welches Kind und welchen Elternprozess sprechen Sie? Per Definition wird ein Shell-Skript von einem Shell-Prozess ausgeführt! Und warum fragst du? Zeigen Sie bitte Ihr Skript! –

+0

Ich werde meine Frage umformulieren – AlwaysALearner

+2

Warte ... wie gibt dir dieser 'cat' Befehl eine PID? –

Antwort

84

Verwenden Sie einfach:

pgrep -P $your_process1_pid 
+1

Der aktuelle Prozess ist der Shell-Prozess! –

+0

pgrep -P \ 'pidofproc/pfad/zu/dein/process1 \' – Arwen

12

Der Shell-Prozess $$ ist, da es ein special parameter ist

Unter Linux das proc(5) Dateisystem eine Vielzahl von Informationen über Prozesse gibt. Vielleicht pgrep(1) (die auf /proc zugreift) könnte auch helfen.

So versuchen Sie cat /proc/$$/status, um den Status des Shell-Prozesses zu erhalten.

Daher könnte seine Elternprozess-ID mit z.B.

parpid=$(awk '/PPid:/{print $2}' /proc/$$/status) 

Dann $parpid in Ihrem Skript verwenden, um den übergeordneten Prozess pid (Mutter der Schale) zu verweisen.

Aber ich glaube nicht, dass Sie es brauchen!

Lesen Sie einige Bash Guide (oder mit Vorsicht , die Fehler hat) und advanced linux programming.

Beachten Sie, dass einige Server-Daemon-Prozesse (die in der Regel eindeutig sein müssen) ihre PID explizit in /var/run schreiben, z. Der sshd Server-Daemon schreibt seine PID in die Textdatei /var/run/sshd.pid). Möglicherweise möchten Sie ein solches Feature in Ihre eigenen serverähnlichen Programme einfügen (codiert in C, C++, Ocaml, Go, Rust oder einer anderen kompilierten Sprache).

+0

Von #bash auf chat.freenode.net's greybot: Der berüchtigte "Advanced" Bash Scripting Guide sollte vermieden werden, es sei denn, Sie wissen, wie man den Müll ausfiltert . Es wird Ihnen beibringen, Fehler zu schreiben, keine Skripte. In diesem Licht wurde der BashGuide geschrieben: http://mywiki.wooled.org/BashGuide; Ich dachte nur, ich würde es erwähnen! – Samadi

38

Ich bin mir nicht sicher, ob ich Sie richtig verstehe, hilft das?

ps --ppid <pid of the parent> 
14

Ich habe ein scrpit geschrieben, um alle untergeordneten Prozess-PIDs eines Elternprozesses zu erhalten. Hier ist der Code.Hope es hilft.

function getcpid() { 
    cpids=`pgrep -P $1|xargs` 
# echo "cpids=$cpids" 
    for cpid in $cpids; 
    do 
     echo "$cpid" 
     getcpid $cpid 
    done 
} 

getcpid $1 
2
ps -axf | grep parent_pid 

Above Befehl druckt jeweils von parent_pid erzeugten Prozesse, hoffe, es hilft. +++++++++++++++++++++++++++++++++++++++++++

[email protected]:~/chk_prgrm/lp# 

parent...18685 

child... 18686 


[email protected]:~/chk_prgrm/lp# ps axf | grep frk 

18685 pts/45 R  0:11 |  \_ ./frk 

18686 pts/45 R  0:11 |  | \_ ./frk 

18688 pts/45 S+  0:00 |  \_ grep frk 
-3
#include<stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    // Create a child process  
    int pid = fork(); 

    if (pid > 0) 
    { 

      int j=getpid(); 

      printf("in parent process %d\n",j); 
    } 
    // Note that pid is 0 in child process 
    // and negative if fork() fails 
    else if (pid == 0) 
    { 





      int i=getppid(); 
      printf("Before sleep %d\n",i); 

      sleep(5); 
      int k=getppid(); 

      printf("in child process %d\n",k); 
    } 

    return 0; 

}

+0

Dieser Code hilft Ihnen von init() nimmt einen verwaisten Prozess als Kind – user7329527

+0

Dies ist keine Antwort. Es ist nur ein Codeblock, der nichts mit der Frage zu tun hat. – melpomene