So erhalten Sie einen untergeordneten Prozess vom übergeordneten Prozess

75

Ist es möglich, die untergeordnete Prozess-ID von der übergeordneten Prozess-ID im Shell-Skript abzurufen?

Ich muss eine Datei mit einem Shell-Skript ausführen, was zu einem neuen Prozess process1 (übergeordneter Prozess) führt. Diese process1 hat einen weiteren Prozess gegabelt process2 (Child - Prozess). Mithilfe eines Skripts kann ich die PID von process1 mithilfe des folgenden Befehls abrufen :

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

Aber ich kann die PID des untergeordneten Prozesses nicht abrufen.

AlwaysALearner
quelle
1
Über 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!
Basile Starynkevitch
3
Warten Sie ... wie gibt catIhnen dieser Befehl eine PID?
Miklos Aubert
2
Es scheint wirklich, dass Sie sehr verwirrt sind!
Basile Starynkevitch
1
Ich zweite @BasileStarynkevitch: Bitte zeigen Sie uns Ihr Skript oder zumindest den relevanten Teil.
Miklos Aubert
2
@ y_159. Verwenden Sie strace (1) für Programme, die Ihren ähnlich sind (z. B. on psoder top), um herauszufinden, um welche Systemaufrufe (2) es sich handelt, oder lassen Sie sich von bestehenden Projekten - ähnlich wie Ihre - auf github oder gitlab
Basile Starynkevitch

Antworten:

150

Benutz einfach :

pgrep -P $your_process1_pid
Miklos Aubert
quelle
1
Der aktuelle Prozess ist der Shell-Prozess!
Basile Starynkevitch
1
pgrep -P `pidofproc / path / to / your / process1`
Arwen
pgrep -P 'ppid' listet auch den toten Prozess auf. Wie liste ich nur den aktiven Prozess auf?
ARUNBALAN NV
57

Ich bin mir nicht sicher, ob ich dich richtig verstehe. Hilft das?

ps --ppid <pid of the parent>
Kent
quelle
13
die Frage mit dem Tag "Linux"
Kent
22

Ich habe ein Scrpit geschrieben, um alle untergeordneten Prozess-Pids eines übergeordneten Prozesses abzurufen. Hier ist der Code. Hoffentlich hilft es.

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

getcpid $1
Doof
quelle
15

Der Shell-Prozess ist, $$da es sich um einen speziellen Parameter handelt

Unter Linux bietet das Dateisystem proc (5) viele Informationen zu Prozessen. Vielleicht hilft auch pgrep (1) (der Zugriff /proc).

Versuchen Sie also cat /proc/$$/status, den Status des Shell-Prozesses abzurufen.

Daher könnte seine übergeordnete Prozess-ID mit z

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

Verwenden Sie dann $parpidin Ihrem Skript, um auf die übergeordnete Prozess-PID (das übergeordnete Element der Shell) zu verweisen.

Aber ich glaube nicht, dass du es brauchst!

Lesen Sie einige Bash-Anleitungen (oder mit Vorsicht erweiterte Bash-Scripting-Anleitungen , die Fehler enthalten) und erweiterte Linux-Programmierung .

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

Basile Starynkevitch
quelle
Von #bash auf chat.freenode.nets Greybot: Der berüchtigte "Advanced" Bash Scripting Guide sollte vermieden werden, es sei denn, Sie wissen, wie man den Müll herausfiltert. Es wird Ihnen beibringen, Fehler zu schreiben, keine Skripte. In diesem Licht wurde der BashGuide geschrieben: mywiki.wooledge.org/BashGuide ; Ich dachte nur, ich würde es erwähnen!
vktec
11

Um den untergeordneten Prozess und Thread zu erhalten , pstree -p PID. Es zeigt auch den hierarchischen Baum

wo23
quelle
9
ps -axf | grep parent_pid 

Der obige Befehl druckt die jeweiligen Prozesse aus parent_pid, von denen ich hoffe, dass sie helfen. ++++++++++++++++++++++++++++++++++++++++++++++++

root@root:~/chk_prgrm/lp#

 parent...18685

 child... 18686


root@root:~/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
krishna
quelle
3

Sie können den pidsaller untergeordneten Prozesse eines bestimmten übergeordneten Prozesses abrufen, <pid>indem Sie den /proc/<pid>/task/<tid>/childrenEintrag lesen .

Diese Datei enthält die Pids der untergeordneten Prozesse der ersten Ebene.

Weitere Informationen finden Sie unter https://lwn.net/Articles/475688/.

y_159
quelle
Rekursiv tun Sie dies für <Kinder Pids>
y_159
0

Für den Fall, dass der interessierende Prozessbaum mehr als 2 Ebenen hat (z. B. erzeugt Chromium einen 4-stufigen tiefen Prozessbaum), pgrepist dies nicht von großem Nutzen. Wie bereits erwähnt, enthalten procfs- Dateien alle Informationen zu Prozessen und müssen nur gelesen werden. Ich habe ein CLI-Tool namens Procpath erstellt, das genau dies tut. Es liest alle /proc/N/statDateien, stellt den Inhalt als JSON-Baum dar und macht ihn für JSONPath-Abfragen verfügbar.

Um alle durch Kommas getrennten PIDs eines Nachkommenprozesses eines Nicht-Root-Prozesses zu erhalten (für den Root ist es ..stat.pid), ist es:

$ procpath query -d, "..children[?(@.stat.pid == 24243)]..pid"
24243,24259,24284,24289,24260,24262,24333,24337,24439,24570,24592,24606,...
saaj
quelle
-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;

}}

user7329527
quelle
Dieser Code hilft Ihnen von init () nimmt einen verwaisten Prozess als
untergeordnetes Element