Na coluna proc
(ênfase minha):
/proc/[pid]/stat
Status information about the process. This is used by ps(1).
It is defined in /usr/src/linux/fs/proc/array.c.
pid %d The process ID.
The fields, in order, with their proper scanf(3) format speci‐
fiers, are:
comm %s The filename of the executable, in parentheses.
This is visible whether or not the executable is
swapped out.
state %c One character from the string "RSDZTW" where R is
running, S is sleeping in an interruptible wait, D
is waiting in uninterruptible disk sleep, Z is zom‐
bie, T is traced or stopped (on a signal), and W is
paging.
-----> ppid %d The PID of the parent. <--------
...
Então, o que você deseja provavelmente pode ser feito analisando /proc/<pid>/stat
para o PPID (ID do processo pai) e, em seguida, analisando /proc/<ppid>/stat
para o seu PPID e assim por diante até encontrar um PPID de 1 .
A linha de comando do ancestral pode ser encontrada em /proc/<ancestor_pid>/cmdline
.
Nota:
Este método e o método Como você já tem pstree
mencionado pelo icyrock.com presumem que seu * nix tem um sistema de arquivos proc
, o que nem sempre é o caso. ps
, é seguro assumir que seu sistema suporta procfs
.
Editar:
Este é um snippet do bash que implementará o método acima (assume que pid
foi inicializado em outro lugar):
#Initialize ppid to any value (except 1) to start the loop:
ppid=2
while [[ $ppid -ne 1 ]]
do
ppid=$(cut -d' ' -f4 /proc/${pid}/stat)
if [[ $ppid -eq 1 ]]
then
cat /proc/${pid}/cmdline
fi
pid=$ppid
done