Ein Weg über bash in case „Situation wie dieser, wo ich weiß nicht genau mit dem Namen des Kindes Prozess“, um zumindest zu prüfen, aber kennt den Namen des übergeordneten Prozesses angenommen werden einzigartige, kann man in bash
basierend auf ps
verwenden, grep
, sed
(für kleinere PIDs führenden Raum zu entfernen), tr
(multiple consecuting Räume in eine drücken) und cut
:
$> cat foo_bar.sh
#! /bin/bash
sleep 120
$> ./foo_bar.sh &
[1] 89239
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^\ //g |cut -f 1 -d ' ') "|grep -v foo_bar.sh| sed s/^\ //g | tr -s ' ' | cut -f 1,3 -d ' '
89241 sleep
So ist der eindeutige Name des übergeordneten Prozesses wird verwendet, um die Mutter pid zu bestimmen:
$> ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^\ //g |cut -f 1 -d ' '
89239
Diese in einem Teilprozess ausgewertet ($(...)
) verwendet wird, um die richtige Linie von einem anderen ps
Aufruf grep die seeked pid von zu bestimmen, Kind und Name (ohne zusätzliche Argumente und ohne vorherige Kenntnis des Namens des Kindes.
Hinweis - wie in bash gewohnt einige Räume sind wichtig - der zusätzliche Raum am Ende des Suchmusters:
... grep " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| cut -f 1 -d ' ') " ...
Diese Fehlalarme vermeiden hilft, wie wenn ein Elternteil pid 123, ohne Polsterung mit Räume würde dies viele pids übereinstimmen, die diese Ziffern wie 1234, 12345, 1123, enthalten ...
aktualisieren (auf Kommentar reagieren): bei übergeordneten Prozess a_mama
wird (abzweigt a_shvili
Sub-Prozess) und es ist die Nur mit diesem Namen auf der Maschine verarbeiten, dann die Folgendes sollte funktionieren:
$> p_proc="a_mama"
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep ${p_proc}| grep -v grep| sed s/^\ //g | cut -f 1 -d ' ') "|grep -v ${p_proc}| sed s/^\ //g | tr -s ' ' | cut -f 1,3 -d ' '
12346 a_shvili
warum nicht fork + exec statt Systemaufruf verwenden? – sanjayk79