2013-07-19 5 views
40

È possibile ottenere l'id del processo figlio dall'ID processo padre nello script della shell?Come ottenere il processo figlio dal processo principale

Ho un file da eseguire utilizzando lo script di shell, che porta a un nuovo processo process1 (processo padre). Questo processo ha biforcato un altro processo process2 (processo figlio). Utilizzando sceneggiatura, io sono in grado di ottenere il PID di process1 usando il comando:

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

ma io sono in grado di recuperare il pid del processo figlio.

+1

Di quale genitore e di quale genitore stai parlando? Per definizione, uno script di shell viene eseguito da un processo shell! E perché lo chiedi? Mostra il tuo script per favore! –

+0

Riformulerò la mia domanda – AlwaysALearner

+2

Aspetta ... in che modo il comando 'cat' ti dà un PID? –

risposta

84

Basta usare:

pgrep -P $your_process1_pid 
+1

Il processo corrente è il processo di shell! –

+0

pgrep -P \ 'pidofproc/path/to/your/process1 \' – Arwen

12

Il processo shell è $$ dal momento che è un special parameter

Su Linux, il file system proc(5) dà un sacco di informazioni sui processi. Forse pgrep(1) (che accede a /proc) potrebbe essere d'aiuto.

Quindi provare cat /proc/$$/status per ottenere lo stato del processo della shell.

Quindi, l'ID del processo principale può essere recuperato con ad es.

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

Quindi utilizzare $parpid nello script per fare riferimento al pid processo genitore (genitore del guscio).

Ma non credo che ne abbiate bisogno!

Leggere un po 'di Bash Guide (o con cautela advanced bash scripting guide, che ha errori) e advanced linux programming.

Si noti che alcuni processi daemon del server (che di solito devono essere univoci) scrivono esplicitamente il loro pid in /var/run, ad es. il daemon del server sshd sta scrivendo il suo pid nel file di testo /var/run/sshd.pid). Si consiglia di aggiungere tale funzionalità nei propri programmi server (codificati in C, C++, Ocaml, Go, Rust o altri compilati nella lingua).

+0

Da #bash su chat.freenode.net's greybot: La famigerata Guida di scripting di Bash "Avanzata" dovrebbe essere evitata a meno che non si sappia come filtrare la posta indesiderata . Ti insegnerà a scrivere bug, non script. In questa luce, la BashGuide è stata scritta: http://mywiki.wooledge.org/BashGuide; Ho solo pensato di dirlo! – Samadi

38

Non sono sicuro che se ho capito bene, questo aiuto?

ps --ppid <pid of the parent> 
14

Ho scritto una scala per ottenere tutti i pids di processo figlio di un processo padre. Ecco il codice. Spero che sia d'aiuto.

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 

Sopra comando stampa rispettivi processi generati da parent_pid, spero che aiuta. +++++++++++++++++++++++++++++++++++++++++++

[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

questo codice ti aiuta da init() accetta un processo orfano come figlio – user7329527

+0

Questa non è una risposta. È solo un blocco di codice che non ha nulla a che fare con la domanda. – melpomene