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.
linux
shell
process
child-process
AlwaysALearner
quelle
quelle
cat
Ihnen dieser Befehl eine PID?ps
odertop
), um herauszufinden, um welche Systemaufrufe (2) es sich handelt, oder lassen Sie sich von bestehenden Projekten - ähnlich wie Ihre - auf github oder gitlabAntworten:
Benutz einfach :
pgrep -P $your_process1_pid
quelle
Ich bin mir nicht sicher, ob ich dich richtig verstehe. Hilft das?
quelle
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
quelle
Der Shell-Prozess ist,
$$
da es sich um einen speziellen Parameter handeltUnter 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
$parpid
in 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.sshd
schreibt 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).quelle
Um den untergeordneten Prozess und Thread zu erhalten ,
pstree -p PID
. Es zeigt auch den hierarchischen Baumquelle
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
quelle
Sie können den
pids
aller untergeordneten Prozesse eines bestimmten übergeordneten Prozesses abrufen,<pid>
indem Sie den/proc/<pid>/task/<tid>/children
Eintrag lesen .Diese Datei enthält die Pids der untergeordneten Prozesse der ersten Ebene.
Weitere Informationen finden Sie unter https://lwn.net/Articles/475688/.
quelle
Für den Fall, dass der interessierende Prozessbaum mehr als 2 Ebenen hat (z. B. erzeugt Chromium einen 4-stufigen tiefen Prozessbaum),
pgrep
ist 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/stat
Dateien, 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,...
quelle
#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;
}}
quelle